Cod sursa(job #198082)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 8 iulie 2008 13:38:13
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 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;
    }