Cod sursa(job #496372)
#include<cstdio>
const int MOD=9901;
int B;
const int N=1000000;
void fisiere()
{
freopen("sumdiv.in","r",stdin);
freopen("sumdiv.out","w",stdout);
}
int np;
int exp[N],div[N];
void descomp(int a)
{
int d=2,e;
while (d*d<=a)
{
if (a%d)
{
++d;
continue;
}
e=0;
while (a%d==0)
{
++e;
a/=d;
}
exp[++np]=e;
div[np]=d;
++d;
}
if (a!=1)
{
exp[++np]=1;
div[np]=a;
}
}
void citeste()
{
int A;
fisiere();
scanf("%d%d",&A,&B);
descomp(A);
}
int put(int p,int e)
{
if (e==0) return 1;
if (e%2==0)
return put((p*p)%MOD,e/2)%MOD;
return p%MOD*put((p*p)%MOD,e/2)%MOD;
}
int inv[MOD+2];
void inverse()
{
int i;
inv[1]=1;
for (i=2;i<MOD;++i)
if (inv[i]==0)
{
inv[i]=put(i,MOD-2);
inv[inv[i]]=i;
}
}
void rezolva()
{
int s=1,i;
for (i=1;i<=np;++i)
exp[i]=exp[i]*B;
for (i=1;i<=np;++i)
{
if (div[i]%MOD-1!=0)
{
s*=(put(div[i],exp[i]+1)+MOD-1)%MOD;
s%=MOD;
s*=inv[(div[i]+MOD-1)%MOD]%MOD;
s%=MOD;
}
else
s*=(exp[i]+1)%MOD;
s%=MOD;
}
printf("%d",s);
}
int main()
{
citeste();
inverse();
rezolva();
return 0;
}