Pagini recente » Cod sursa (job #903083) | Cod sursa (job #1678608) | Cod sursa (job #805167) | Cod sursa (job #597363) | Cod sursa (job #2113022)
#include <iostream>
#include <fstream>
using namespace std;
#define p 9901
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
int a,b,n,nrnr=1,nrdiviz=0,i,x,y,d,r,s=1;
int nrprime[100000],diviz[100000],qdiviz[100000];
int mod(int x)
{
if(x>p)
x%=p;
return x;
}
void inversModular(int a,int b,int &x,int &y,int &d)
{
if(b==0)
{
x=1;
y=0;
d=a;
}
else
{
int x0,y0;
inversModular(b,a%b,x0,y0,d);
x=y0;
y=x0-(a/b)*y0;
}
}
int logPut(int a,int b)
{
if(b==0) return 1;
if(b==1) return a;
int aux=mod(logPut(a,b/2));
if(b&1) return mod(mod(aux*aux)*a);
else return mod(aux*aux);
}
void generareNrPrime(int n)
{
nrprime[1]=2;
for(int i=3;i<=n;i+=2)
{ int ok=1;
for(int j=2;j<=nrnr&&nrprime[j]*nrprime[j]<=i;j++)
{
if(i%nrprime[j]==0)
{
ok=0;break;
}
}
if(ok)
{
nrnr++;
nrprime[nrnr]=i;
}
}
}
int main()
{
fin>>a>>b;
generareNrPrime(a);
for(i=1;i<=nrnr&&a!=1;i++)
if(a%nrprime[i]==0)
{
nrdiviz++;
diviz[nrdiviz]=nrprime[i];
while(a%nrprime[i]==0)
{
a/=nrprime[i];
qdiviz[nrdiviz]++;
}
}
for(i=1;i<=nrdiviz;i++)
qdiviz[i]*=b;
for(i=1;i<=nrdiviz;i++)
{
r=logPut(diviz[i],qdiviz[i]+1)-1;
if(r<0)r+=p;
inversModular(diviz[i]-1,p,x,y,d);
while(x<0)x+=p;
x=mod(x);
r*=x;
r=mod(r);
s*=r;
s=mod(s);
}
fout<<s;
return 0;
}