Cod sursa(job #883704)

Utilizator darrenRares Buhai darren Data 20 februarie 2013 11:52:17
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int MOD = 9901;

int power(int x, long long y)
{
    if (y == 0) return 1;
    if (y % 2 == 0) return power(1LL * x * x % MOD, y >> 1);
    return 1LL * x * power(1LL * x * x % MOD, y >> 1) % MOD;
}
inline int invmod(int x)
{
    return power(x, MOD - 2);
}

int A, B;
int result = 1;

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

    fin >> A >> B;

    if (A == 0)
    {
        fout << A << '\n';
        fin.close();
        fout.close();
        return 0;
    }

    for (int i = 2; i * i <= A; ++i)
    {
        int times = 0;
        while (A % i == 0)
        {
            ++times;
            A /= i;
        }

        int auxres = power(i, 1LL * B * times + 1);
        auxres -= 1;
        if (auxres < 0) auxres += MOD;
        auxres = 1LL * auxres * invmod(i - 1) % MOD;

        result = 1LL * result * auxres % MOD;
    }
    if (A != 1)
    {
        int auxres = power(A, B + 1);
        auxres -= 1;
        if (auxres < 0) auxres += MOD;
        auxres = 1LL * auxres * invmod(A - 1) % MOD;

        result = 1LL * result * auxres % MOD;
    }

    fout << result << '\n';

    fin.close();
    fout.close();
}