Cod sursa(job #918411)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 18 martie 2013 20:52:29
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <stdio.h>
#include <math.h>

using namespace std;
FILE *f=fopen("sumdiv.in","r");
FILE *g=fopen("sumdiv.out","w");

const int mod=9901;

short cr[10001];
unsigned long long  a,b,i,sum,p,max,x,y;

unsigned long long ridic(unsigned long long n,unsigned long long k)
{
 unsigned long long i,a,s;
 a=n;
 s=1;
 for(i=0;(1<<i)<=k;i++)

  {
    if (((1<<i)&k)>0)s=(s*a)%mod;
   a=(a*a)%mod;
  }
return s;
}

void ciur()
{
 int i,j;

 for(i=3;i<=max;i+=2)
   if (cr[i]==0)
     for(j=i+i;j<=max;j+=i)
      cr[j]=1;
}


int main()
{
fscanf(f,"%d%d",&a,&b);
max=trunc(sqrt(a));
sum=1;
ciur();
for(i=2;i*i<=a;i++)
if (cr[i]==0 && a%i==0)
{
    p=0;
    while(a%i==0){a=a/i;p++;}

x=(ridic(i,p*b+1)-1)%mod;
y=(ridic(i-1,mod-2)%mod);
sum=((sum%mod)*(x*y)%mod)%mod;
}
if (a!=1)
{
x=(ridic(a,b+1)-1)%mod;
y=(ridic(a-1,mod-2)%mod);
sum=((sum%mod)*(x*y)%mod)%mod;
}

fprintf(g,"%d",sum);
fclose(g);
return 0;
}