Pagini recente » Cod sursa (job #2038450) | Cod sursa (job #2312399) | Cod sursa (job #414282) | Borderou de evaluare (job #2050147) | Cod sursa (job #2929507)
#include <iostream>
#include <fstream>
#define MOD 9901
#define SqrtA 7071
using namespace std;
ifstream fin ("sumdiv.in");
ofstream fout ("sumdiv.out");
short nrprime,nrfact;
int a,b,i,j,sol=1,p;
bool ciur[SqrtA+1];
int prim[SqrtA/5], baza[SqrtA/5], ex[SqrtA/5];
int pow(int n,int p){
if (p==1)
return n;
else if (p%2==0)
return pow((long long)n*n%MOD,p/2);
return (long long)n*pow((long long)n*n%MOD,p/2)%MOD;
}
int invmod(int nr){
return pow(nr, MOD-2);}
int main()
{
///precalculare ciur
ciur[0]=ciur[1]=1;
for (i=4;i<=SqrtA;i+=2)
ciur[i]=1;
for (i=3;i*i<=SqrtA;i+=2)
if (ciur[i]==0)
for (j=i*i;j<=SqrtA;j+=i)
ciur[j]=1;
for (i=2;i<=SqrtA;i++)
if (ciur[i]==0)
prim[nrprime++]=i;
///descompunere a in fact primi
fin>>a>>b;
if (a==0)
fout<<'0';
else if (b==0)
fout<<'1';
else{
i=0;
while (a!=1 && i<nrprime){
if (a%prim[i]==0){
baza[nrfact]=prim[i];
while (a%prim[i]==0){
a/=prim[i];
ex[nrfact]++;
}
nrfact++;
}
i++;
}
if (a>1){
baza[nrfact]=a;
ex[nrfact++]=1;
}
for (i=0;i<nrfact;i++)
ex[i]*=b;
///luam fiecare baza si exponent in parte
for (i=0;i<nrfact;i++){
p=pow(baza[i], ex[i]+1)-1;
if (p==0){
p=(ex[i]+1)%MOD;
}
else{
if (p<0)
p+=MOD;
sol=sol*invmod(baza[i]-1)%MOD;
}
sol=sol*p%MOD;
}
fout<<sol;
}
return 0;
}