Cod sursa(job #141173)

Utilizator SycronVene Tian Sycron Data 22 februarie 2008 20:16:17
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<stdio.h>   
#define Mod 9901   
#define Nrdivm (1<<14)   
#define Nrpfm 10   
int a,b,ans;   
  
void read()   
{   
    freopen("sumdiv.in","r",stdin);   
    scanf("%d%d",&a,&b);   
}   
  
int power(int a, int n)   
{   
    if(!n)   
        return 1;   
  
    int v=power(a,n>>1);   
  
    if(n&1)   
        return v*v%Mod*(a%Mod)%Mod;   
    return v*v%Mod;   
}   
  
int sum(int p, int n)   
{   
    if(!n)   
        return 1;   
    if(n&1)   
        return sum(p,n>>1)*(power(p,(n>>1)+1)+1)%Mod;   
    return (sum(p,n-1)+power(p,n))%Mod;   
}   
  
void solve()   
{   
    int Div[Nrdivm],Pf[Nrpfm],M[Nrpfm],nrdiv=0,nrpf=0,i;   
  
    for(i=1;i*i<=a;++i)   
        if(a%i==0)   
            Div[++nrdiv]=i;   
    for(i=nrdiv;i;--i)   
        Div[++nrdiv]=a/Div[i];   
    for(i=2+(a==1);i<=nrdiv;++i)   
        if(a%Div[i]==0)   
        {   
            Pf[++nrpf]=Div[i];   
            M[nrpf]=0;   
            while(a%Div[i]==0)   
            {   
                ++M[nrpf];   
                a/=Div[i];   
            }   
        }   
    ans=1;   
    for(i=1;i<=nrpf;++i)   
        ans=ans*sum(Pf[i],M[i]*b)%Mod;   
}   
               
void write()   
{   
    freopen("sumdiv.out","w",stdout);   
    printf("%d\n",ans);   
}   
  
int main()   
{   
    read();   
    solve();   
    write();   
    return 0;   
}