题目连接:约数之和
假设现在有两个自然数 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);
}
}