Cod sursa(job #1479965)

Utilizator acomAndrei Comaneci acom Data 1 septembrie 2015 19:15:34
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<fstream>
using namespace std;
#define LL long long
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
#define MOD 9901
LL a,b,p,sol=1;
LL cmmdc(LL A, LL B, LL &X, LL &Y)
{
    LL X0,Y0;
    if (!B)
    {
        X=1, Y=0;
        return A;
    }
    LL D=cmmdc(B,A%B,X0,Y0);
    X=Y0, Y=X0-(A/B)*Y0;
    return D;
}
LL pow(LL N, LL K)
{
    LL s=1;
    while (K)
    {
        if (K&1) s=(s*N)%MOD;
        N=(N*N)%MOD, K>>=1;
    }
    return s;
}
int main()
{
    LL d;
    fin>>a>>b;
    for (d=2;d*d<=a;++d)
        if (a%d==0)
        {
            p=0;
            while (a%d==0) ++p, a/=d;
            if (d%MOD==1) sol*=(b*p+1), sol%=MOD;
            else
            {
                LL x,y;
                sol*=pow(d,b*p+1)-1, sol%=MOD;
                cmmdc(d-1,MOD,x,y);
                sol=(sol*x)%MOD, sol=(sol+MOD)%MOD;
            }
        }
    if (a>1)
    {
        if (a%MOD==1) sol*=(b+1), sol%=MOD;
        else
        {
            LL x,y;
            sol*=pow(a,b+1)-1, sol%=MOD;
            cmmdc(a-1,MOD,x,y);
            sol=(sol*x)%MOD, sol=(sol+MOD)%MOD;
        }
    }
    fout<<sol<<"\n";
    return 0;
}