Pagini recente » Monitorul de evaluare | oni_cl_11-12 | Istoria paginii runda/test321/clasament | Istoria paginii runda/oji_simulare_02 | Cod sursa (job #1174564)
#include <cstdio>
FILE* in;
FILE* out;
int euclid(int a, int b, int& x, int& y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int d,x0,y0;
d=euclid(b,a%b,x0,y0);
x=y0;
y=x0-(a/b)*y0;
return d;
}
int a,b;
const int Q=100001,R=9901;
int div[Q],nr[Q],loc;
int pow(long long x, int p)
{
long long rez=1;
while(p)
{
if(p%2==1)
{
rez*=x;
rez%=R;
}
p/=2;
x=(x*x)%R;
}
return rez;
}
int main()
{
in=fopen("sumdiv.in","r");
out=fopen("sumdiv.out","w");
fscanf(in,"%d%d",&a,&b);
if(a==0)
{
fprintf(out,"0");
return 0;
}
if(a==1 || b==0)
{
fprintf(out,"1");
return 0;
}
int a0=a;
int nra;
for(int i=2; i*i<=a; i++)
{
if(a%i==0)
{
nra=0;
while(a%i==0)
{
nra++;
a/=i;
}
loc++;
div[loc]=i;
nr[loc]=nra*b;
}
}
if(a>1)
{
div[++loc]=a;
nr[loc]=b;
}
a=a0;
long long rez=1;
int act,aux;
for(int i=1; i<=loc; i++)
{
rez*=pow(div[i],nr[i]+1)-1;
rez%=R;
aux=euclid(div[i]-1,R,act,aux);
if(act<0)
act+=R;
rez*=act;
rez%=R;
}
fprintf(out,"%d",rez);
return 0;
}