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).
The natural divisors of 8 are: 1,2,4,8. Their sum is 15.
15 modulo 9901 is 15 (that should be output).
Source
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
逆元+等比数列求和~
因为num没有清零检查了两个小时……果然总是用撤回是会出问题的……
(以上来自ACdreamer~)
#include<cstdio>
#define modd 9901
#define ll long long
ll x,b,num,ans,cnt,pri[10001];
bool bb[10001];
ll cal(ll u,ll v,ll mod)
{
ll ret=0;u%=mod;
while(v)
{
if(v&1) ret=(ret+u)%mod;
u=(u+u)%mod;
v>>=1;
}
return ret;
}
ll mi(ll u,ll v,ll mod)
{
ll ret=1;u%=mod;
while(v)
{
if(v&1) ret=cal(ret,u,mod);
u=cal(u,u,mod);
v>>=1;
}
return ret;
}
int main()
{
for(int i=2;i<=10000;i++)
{
if(!bb[i]) pri[++cnt]=i;
for(int j=1;pri[j]*i<=10000;j++)
{
bb[pri[j]*i]=1;
if(!(i%pri[j])) break;
}
}
scanf("%lld%lld",&x,&b);ans=1;
for(int i=1;pri[i]*pri[i]<=x;i++)
if(!(x%pri[i]))
{
num=0;while(!(x%pri[i])) num++,x/=pri[i];
ll k=(pri[i]-1)*modd;
ans=(ans*((mi(pri[i],num*b+1,k)+k-1)/(pri[i]-1)))%modd;
}
if(x>1)
{
ll k=(x-1)*modd;
ans=(ans*((mi(x,b+1,k)+k-1)/(x-1)))%modd;
}
printf("%lld\n",ans);
return 0;
}