Cod sursa(job #833166)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 11 decembrie 2012 23:25:40
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.71 kb
#include<cstdio>
int64 a,b,s,p,i;

int64 A(int64 a,int64 n)
{int64 x;
if(!n)
      return 1;
x=A(a,n>>1);
x=(x*x)%9901;
if(n&1)
    x=(x*a)%9901;
return x;}

int64 C(int64 a)
{int64 r;
if(!a)
    return 0;
for(r=1;r%a;r+=9901);
return r/a;}

int64 B(int64 q,int64 e)
{if(q==1)
    return (e+1)%9901;
return (((A(q,e+1)+9900)%9901)*C((q+9900)%9901))%9901;}

int main()
{freopen("sumdiv.in","r",stdin),freopen("sumdiv.out","w",stdout);
scanf("%lld%lld",&a,&b);
while(!(a&1))
     p++,a>>=1;
s=B(2,p*b);
for(i=3;i*i<=a;i+=2)
if(!(a%i))
     {p=0;
     while(!(a&i))
            p++,a/=i;
     s=(s*B(i%9901,p*b))%9901;}
if(a>1)
     s=(s*B(a%9901,b))%9901;
printf("%lld",s);
return 0;}