Cod sursa(job #253272)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 16:53:32
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
 #include <cstdio>  
 const int p=9901;  
 int pow(int a,int n){  
     int w;  
     if (n==0) return 1;  
     if (n==1) return a;  
     if (n&1) {w=pow(a,(n-1)>>1);  
               return (((w*w)%p)*a)%p;}  
     w=pow(a,n>>1);  
     return (w*w)%p;;  
     }  
 int inv(int a){  
     return pow(a%p,p-2);  
     }  
 bool prim(int a){  
      int d;  
      bool ok=true;  
      if (a==1) return false;  
      if (a==2) return true;  
      if (a%2==0) return false;  
      for (d=3;d*d<=a && ok;d+=2)  
        if (a%d==0) ok=false;  
      return ok;  
      }  
 int main(){  
     int d=2,w,r,a,b,s,sol=1,k;  
     freopen("sumdiv.in","r",stdin);  
     freopen("sumdiv.out","w",stdout);  
     scanf("%d %d",&a,&b);  
     w=a;  
     while (d*d<=a){  
       if (a%d==0){  
         k=0;  
         while (w%d==0) k++,w/=d;  
         k*=b;  
         if (d%p==1) s=(k+1)%p;  
         else{  
         s=pow(d%p,k+1);  
         s--;if (s==-1) s=p-1;  
         s=(s*inv(d-1))%p;  
             }  
         sol=(sol*s)%p;  
         r=a/d;  
         if (w%r==0)  
          if (prim(r)){  
           k=0;            
           while (w%r==0) k++,w/=r;  
           k*=b;  
           if (r%p==1) s=(k+1)%p;  
           else{  
           s=pow(r%p,k+1);  
           s--;if (s==-1) s=p-1;  
           s=(s*inv(r-1))%p;  
                }  
           sol=(sol*s)%p;}  
           }   
         d++;  
         }  
     printf("%d",sol);  
     return 0;  
}