Cod sursa(job #1221414)

Utilizator EpictetStamatin Cristian Epictet Data 20 august 2014 14:16:38
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <fstream>
#define MOD 9901
#define LL long long
using namespace std;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
LL A, B;

LL lgput(LL x, LL p)
{
    LL val = 1;
    while (p)
    {
        if (p & 1) val = val * x % MOD;
        x = x * x % MOD;
        p = p / 2;
    }
    return val;
}

void Solve()
{
    LL sd = 1;

    for (int i=2; i*i<=A && A>1; i++)
    {
        if (A % i) continue;
        int p = 0;

        while (A % i == 0)
        {
            p++;
            A /= i;
        }

        sd = (sd * (lgput(i, B * p + 1) - 1 + MOD) % MOD / (i - 1)) % MOD;
    }

    if (A > 1)
    {
        if (A % MOD == 1)
        {
            sd = (sd * (B + 1)) % MOD;
        }
        else
        {
            sd = (sd * (lgput(A, B + 1) - 1 + MOD) % MOD / (A - 1)) % MOD;
        }
    }
    fout << sd << '\n';
}

int main()
{
    fin >> A >> B;
    Solve();
    fout.close();
    return 0;
}