Cod sursa(job #74426)

Utilizator sealTudose Vlad seal Data 25 iulie 2007 18:38:12
Problema Suma divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 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;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])%Mod;
}
            
void write()
{
    freopen("sumdiv.out","w",stdout);
    printf("%d\n",ans);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}