Cod sursa(job #2169749)

Utilizator ovidius11Stiriu Ovidius ovidius11 Data 14 martie 2018 17:07:21
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<cstdio>
#include<cmath>
#define mod 9901
bool c[7105];
int prim[3605],u;
int ciur(int n){
int i,j,lim=(int)sqrt((double)n);
for(i=4;i<=n;i=i+2)
c[i]=1;
c[0]=1;
c[1]=1;
for(i=3;i<=lim;i=i+2)
if (c[i]==0)
for(j=i*i;j<=n;j=j+2*i)
c[j]=1;
prim[++u]=2;
for(i=3;i<=n;i=i+2)
if (c[i]==0)
prim[++u]=i;}
int pow(int b,int e){
int rez=1;
while(e){
if (e%2==1){
rez=(rez*b)%mod;
e--;}
b=(b*b)%mod;
e=e/2;}
return rez;}
int main(){
freopen("sumdiv.in","r",stdin);
freopen("sumdiv.out","w",stdout);
ciur(7100);
int a,b,d,e,rez=1;
scanf("%d%d",&a,&b);
d=1;
while(prim[d]*prim[d]<=a && a>1){
e=0;
while(a%prim[d]==0){
e++;
a=a/prim[d];}
e=e*b;
rez=(rez*(pow(prim[d],e+1)-1+mod))%mod;
rez=(rez*pow(prim[d]-1,mod-2))%mod;
d++;}
if (a>1)
if (a%mod==1)
rez=(rez*(b+1))%mod;
else
{
rez=(rez*(pow(a,b+1)-1+mod))%mod;
rez=(rez*pow(a-1,mod-2))%mod;}
printf("%d\n",rez);
return 0;}