约数之和

假设现在有两个自然数A和B,S是ABAB的所有约数之和。
请你求出S mod 9901的值是多少。
输入格式
在一行中输入用空格隔开的两个整数A和B。
输出格式
输出一个整数,代表S mod 9901的值。
数据范围
0≤A,B≤5×1070≤A,B≤5×107
输入样例:
2 3

输出样例:
15

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

#include 
const int mod = 9901;
int qmi(int a, int k){
 int res = 1;
 a %= mod;
 while(k){
  if (k & 1)  res = res * a % mod;
  a = a * a % mod;
  k >>= 1;
 }
 return res;
}
int sum(int p, int k){
 if (k == 1)   return 1;
 if (k % 2 == 0)    return (1 + qmi(p, k / 2)) * sum(p, k / 2) % mod;
 return (sum(p, k - 1) + qmi(p, k - 1)) % mod;
}
int main(){
 int a, b;
 scanf("%d%d", &a, &b);
 int res = 1;
  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;
 printf("%d\n", res);
 return 0;
}

你可能感兴趣的:(学习随笔)