Cod sursa(job #1958469)

Utilizator GinguIonutGinguIonut GinguIonut Data 8 aprilie 2017 13:40:16
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>

#define MOD 9901

using namespace std;

ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");

long long A, B;

int lgPow(int nr, long long pow)
{
    int Sol=1;
    while(pow)
    {
        if(pow&1)
            Sol=(1ll*Sol*nr)%MOD;
        nr=(1ll*nr*nr)%MOD;
        pow/=2;
    }
    return Sol;
}

int main()
{
    int sumDiv=1;
    fin>>A>>B;
    for(int i=2; i*i<=A; i++)
    {
        if(A%i==0)
        {
            long long nrExp=0;
            while(A%i==0)
            {
                nrExp++;
                A/=i;
            }
            sumDiv=(1ll*sumDiv*(lgPow(i, nrExp*B+1)-1))%MOD;
            sumDiv=(1ll*sumDiv*lgPow(i-1, MOD-2))%MOD;
        }
    }

    if(A!=1)
    {
        if(A%MOD==1)
            sumDiv=(1ll*sumDiv*(B+1))%MOD;
        else
        {
            sumDiv=(1ll*sumDiv*(lgPow(A, B+1)-1))%MOD;
            sumDiv=(1ll*sumDiv*lgPow(A-1, MOD-2))%MOD;
        }
    }
    while(sumDiv<0)
        sumDiv+=MOD;

    fout<<sumDiv;
}