Pagini recente » Solutii Winter Challenge 2008, Runda 1 | Cod sursa (job #155767) | Cod sursa (job #1680969) | Cod sursa (job #2090940) | Cod sursa (job #1680845)
#include <fstream>
#include <cstring>
using namespace std;
int p[15],q[15];
const int m=9901;
int put(int x,int y)
{
if(y==0)
return 1;
if(y%2)
return ((x%m)*put(x,y-1))%m;
else
{
int j=put(x,y/2);
return j*j%m;
}
}
int imod(int x)
{
return put(x,m-2);
}
int fct(int prim,int exp)
{
int v[40],b[35],nb=0,rez=0;
memset(v,0,sizeof(v));
for(int k=0;k<=30; k++)
if(exp&(1<<k))
b[++nb]=k;
v[0]=1;
for(int k=1; k<=b[nb]; k++)
v[k]=v[k-1]*(put(prim,1<<(k-1))+put(prim,1<<k))%m;
for(int k=nb; k>0; k--)
{
rez+=v[b[k]]*imod (put (prim, (1<<(b[k]+1) )-exp-1 ) );
rez%=m;
exp-=1<<b[k];
}
return rez;
}
int main()
{
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
int a,b,np=0,produs=1,i;
fin>>a>>b;
if(a%2==0)
{
np++;
p[1]=2;
while(a%2==0)
{
a/=2;
q[1]++;
}
}
for(i=3; i*i<=a; i+=2)
if(a%i==0)
{
p[++np]=i;
while(a%i==0)
{
a/=i;
q[np]++;
}
}
for(i=1; i<=np; i++)
q[i]=b*q[i]+1;
for(i=1; i<=np; i++)
{
produs*=fct(p[i],q[i]);
produs%=m;
}
fout<<produs;
return 0;
}