Cod sursa(job #675153)

Utilizator GrimpowRadu Andrei Grimpow Data 7 februarie 2012 12:05:23
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<cstdio>
#define M 9901
#define lul unsigned long long
lul v[50],u[50],y,x,i,a,b,j,k,m,t,z,p=1,r,h;
int main()
{FILE *f=fopen("sumdiv.in","r"),*g=fopen("sumdiv.out","w");
fscanf(f,"%llu%llu",&a,&b);
if(a%M==0||!b||a==1)
      {fprintf(g,"1");
      return 0;}
for(i=2;i*i<=a;i++)
      {j=0;
      while(a%i==0&&a)
            j++,a/=i;
      if(j)
            v[++k]=i,u[k]=j;}
if(a>1)
      v[++k]=a,u[k]=1;
for(i=1;i<=k;i++)
      {m=b*u[i]+1,y=1,x=v[i]%M;
      while(m)
              {if(m%2)
                      y=(y*x)%M;
              m/=2;
              x=(x*x)%M;}
      t=M-2,r=(v[i]-1)%M,z=1;
      if(y<0)
              y=M-y;
      if(y)
              y--;
      else
              y=M-1;
      while(t)
              {if(t%2)
                      z=(z*r)%M;
              t/=2;
              r=(r*r)%M;}
      if(z<0)
              z=M-z;
      if(!y)
              y=(b*u[i]+1)%M;
      if(!z)
              z=M-1,h=1;
      p=(p*y*z)%M;}
if(h)
      fprintf(g,"%llu",M-p);
else
      fprintf(g,"%llu",p);
return 0;}