Cod sursa(job #1087481)

Utilizator poptibiPop Tiberiu poptibi Data 19 ianuarie 2014 14:43:56
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;

const int MOD = 9901;

int A, B, Ans = 1, Exp;

int LgPow(int N, int P)
{
    int Now = 1;
    N %= MOD;
    while(P)
    {
        if(P & 1) Now = (1LL * Now * N) % MOD;
        N = (1LL * N * N) % MOD;
        P >>= 1;
    }
    return Now % MOD;
}

int main()
{
    freopen("sumdiv.in", "r", stdin);
    freopen("sumdiv.out", "w", stdout);

    scanf("%i %i", &A, &B);
    for(int i = 2; 1LL * i * i <= A; ++ i)
        if(A % i == 0)
        {
            Exp = 0;
            while(A % i == 0) Exp ++, A /= i;
            Exp *= B;
            if(i % MOD == 1) Ans = (1LL * Ans * (Exp + 1)) % MOD;
            else Ans = (1LL * Ans * (LgPow(i, Exp + 1) - 1 + MOD) % MOD * LgPow(i - 1, MOD - 2)) % MOD;
        }
    if(A > 1)
    {
        if(A % MOD == 1) Ans = (1LL * Ans * (B + 1)) % MOD;
        else Ans = (1LL * Ans * (LgPow(A, B + 1) - 1 + MOD) % MOD * LgPow(A - 1, MOD - 2)) % MOD;
    }

    printf("%i\n", Ans);
}