Cod sursa(job #181475)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 18 aprilie 2008 13:37:50
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <math.h>

long a,b,r,i,p,q,sol;
long div[1000],d[1000],k[1000];

long power(long b, long p){
     long rez=1;
     while (p){
           if ((long)(p&1))rez=(rez*b)%9901;
           p>>=1;
           b=(b*b)%9901;
     }
return rez;
}

long sp(long b,long p){
     if (p==0)return 1;
     if ((long)(p&1))
        return sp(b,p>>1)*(power(b,(p>>1)+1)+1)%9901;
     return (sp(b,p-1)+power(b,p))%9901;
}

int main(){
    freopen("sumdiv.in","r",stdin);
    freopen("sumdiv.out","w",stdout);
    
    scanf("%ld %ld",&a,&b);
    
    r=sqrt(a);
    for (i=1;i<=r;++i)
        if (a%i==0)
           div[++q]=i;
    for (i=q;i;--i)
        div[q+q-i+1]=a/div[i];
    q+=q;
    
    for (i=2;i<=q;i++)
        if (a%div[i]==0){
           if (div[i]==1)continue;
           d[++p]=div[i];
           while (a%div[i]==0){
                 k[p]++;
                 a/=div[i];
           }
        }
    sol=1;
    for (i=1;i<=p;++i){
        sol*=sp(d[i],k[i]*b);
        sol%=9901;
    }
    
    printf("%ld\n",sol);
    
return 0;
}