Cod sursa(job #1162438)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 31 martie 2014 20:18:32
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#define MOD 9901

using namespace std;

bool ciur[10005];
int prim[5000],fact[5000],exp[5000],len,sol=1,a,b;

inline void Ciur()
{
    int i,j;
    for(i=3;i<=100;i+=2)
        if(!ciur[i])
            for(j=i*i;j<=10000;j+=2*i)
                ciur[j]=true;
    prim[++prim[0]]=2;
    for(i=3;i<=10000;i+=2)
        if(!ciur[i])
            prim[++prim[0]]=i;
}

inline void Descomp(int x)
{
    int i,k;
    for(i=1;i<=prim[0] && x>1 && prim[i]*prim[i]<=x;++i)
    {
        k=0;
        while(x%prim[i]==0)
        {
            ++k;
            x/=prim[i];
        }
        if(k)
        {
            ++len;
            fact[len]=prim[i]; exp[len]=k;
        }
    }
    if(x>1)
    {
        if(x%MOD==1)
            sol=b+1;
        else
        {
            ++len;
            fact[len]=x; exp[len]=1;
        }
    }
}

inline int Pow_Log(int x, int p)
{
    int put=1;
    x%=MOD;
    while(p)
    {
        if(p&1)
        {
            put=(1LL*put*x)%MOD;
            --p;
        }
        p>>=1;
        x=(1LL*x*x)%MOD;
    }
    return put;
}

int main()
{
    int i;
    freopen ("sumdiv.in","r",stdin);
    freopen ("sumdiv.out","w",stdout);
    scanf("%d%d", &a,&b);
    if(!a)
        printf("0\n");
    else
    {
        Ciur();
        Descomp(a);
        for(i=1;i<=len;++i)
            exp[i]*=b;
        for(i=1;i<=len;++i)
            sol=(1LL*sol*(Pow_Log(fact[i],exp[i]+1)-1+MOD)*Pow_Log(fact[i]-1,MOD-2))%MOD;
        printf("%d\n", sol);
    }
    return 0;
}