Cod sursa(job #181206)

Utilizator firewizardLucian Dobre firewizard Data 18 aprilie 2008 00:22:33
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 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;      
}