Cod sursa(job #756561)

Utilizator mihaitza22Mihai Nan mihaitza22 Data 9 iunie 2012 21:31:15
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.15 kb
#include<stdio.h>
#define Mod 9901
#define Nrdivm (1<<14)
#define Nrpfm 10
long long a,b,ans;

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 suma(int p, int n)
{
    if(!n)
        return 1;
    if(n&1)
        return suma(p,n>>1)*(power(p,(n>>1)+1)+1)%Mod;
    return (suma(p,n-1)+power(p,n))%Mod;
}

void rezolva()
{
    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*suma(Pf[i],M[i]*b)%Mod;
}


int main()
{
    freopen("sumdiv.in","r",stdin);
    freopen("sumdiv.out","w",stdout);
    scanf("%lld %lld", &a, &b);
    rezolva();
    printf("%lld",ans);
    return 0;
}