约数之和2022-04-06

题目连接:约数之和

假设现在有两个自然数 A 和 B,S 是 AB 的所有约数之和。

请你求出的值是多少。

输入格式

在一行中输入用空格隔开的两个整数 A 和 B。

输出格式

输出一个整数,代表 的值。

数据范围

0≤A,B≤5×10^7

输入样例:

2 3

输出样例:

15

注意: A 和 B 不会同时为 0。

package basic.math04.recursion;

import java.util.Scanner;

/**
 * @author : sicaolong
 * @description :
 * @date : 2022/4/5  2:55 上午
 */
public class NumberOfDivisor {
    static int mod = 9901;

    static int quickMi(int a, int k) {
        int res = 1;
        a %= mod;   //a可能比较大 a*a 可能会爆int直接进行一次取模;
        while (k != 0) {
            //如果是奇数的话
            if ((k & 1) != 0) res = res * a % mod;
            a = a * a % mod;
            k >>= 1;
        }
        return res;
    }

    static int sum(int p, int k) {
        //1、1的时候
        if (k == 1) return 1;
        //2、是偶数的时候
        if ((k & 1) == 0) return (1 + quickMi(p, k / 2)) * sum(p, k / 2) % mod;

        //3、是奇数的时候  把最后一项拿出去;
        return (sum(p, k - 1) + quickMi(p, k - 1)) % mod;
    }

    public static void main(String[] args) {
        int a, b;
        Scanner sc = new Scanner(System.in);
        a = sc.nextInt();
        b = sc.nextInt();
        int res = 1;
        // 对a 进行分解质因数
        for (int i = 2; i * i <= a; i++) {
            if (a % i == 0) {
                int s = 0;
                while (a % i == 0) {
                    a /= i;
                    s++;
                }
                res = res * sum(i, b * s + 1) % mod;
            }
        }
        if (a > 1) res = res * sum(a, b + 1) % mod;
        if (a == 0) res = 0;
        System.out.println(res);
    }
}

你可能感兴趣的:(约数之和2022-04-06)