Description
Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901).
Input
The only line contains the two natural numbers A and B, (0 <= A,B <= 50000000)separated by blanks.
Output
The only line of the output will contain S modulo 9901.
Sample Input
2 3
Sample Output
15
Hint
2^3 = 8.
The natural divisors of 8 are: 1,2,4,8. Their sum is 15.
15 modulo 9901 is 15 (that should be output).
求A^B的因子和
不想多说什么,都是定理http://blog.csdn.net/lyy289065406/article/details/6648539
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <set>
#include <math.h>
#include <algorithm>
#include <queue>
#include <iomanip>
#include <map>
#define INF 0x3f3f3f3f
#define MAXN 10005
#define Mod 9901
using namespace std;
long long power(long long p,long long n)
{
long long tmp=1;
while(n>0)
{
if(n%2)
tmp=(tmp*p)%Mod;
n/=2;
p=(p*p)%Mod;
}
return tmp;
}
long long sum(long long p,long long n)
{
if(n==0)
return 1;
if(n%2==1)
return (sum(p,n/2)*(1+power(p,n/2+1)))%Mod;
else
return (sum(p,n/2-1)*(1+power(p,n/2+1))+power(p,n/2))%Mod;
}
int main()
{
long long a,b;
long long p[MAXN],n[MAXN];
while(~scanf("%I64d%I64d",&a,&b))
{
int k=0;
for(int i=2;i*i<=a;)
{
if(a%i==0)
{
p[k]=i;
n[k]=0;
while(a%i==0)
{
n[k]++;
a/=i;
}
k++;
}
if(i==2)
i++;
else
i+=2;
}
if(a!=1)
{
p[k]=a;
n[k]=1;
k++;
}
long long ans=1;
for(int i=0;i<k;++i)
ans=(ans*(sum(p[i],n[i]*b)%Mod))%Mod;
printf("%I64d\n",ans);
}
return 0;
}