Cod sursa(job #1592365)

Utilizator mariakKapros Maria mariak Data 7 februarie 2016 15:36:43
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <bits/stdc++.h>
#define ll long long
#define Mod 9901
FILE *fin=freopen("sumdiv.in", "r", stdin);
FILE *fout=freopen("sumdiv.out", "w", stdout);

using namespace std;
ll a, b;
ll sol = 1LL;
void read()
{
    scanf("%lld %lld", &a, &b);
}
inline ll Pow(ll x, ll y)
{
    ll i, aux = x, res = 1;
    for(i = 1; i <= y; i <<= 1)
    {
        if( i & y)
            res = (1LL * res * aux) % Mod;
        aux = (1LL * aux * aux) % Mod;
    }
    return res;
}
ll check(ll x)
{
    while(x < 0)
        x += Mod;
    return x;
}
void solve()
{
    int i;
    ll exp;
    for(i = 2; i * i <= a; ++ i)
    {
        if(a % i == 0)
        {
            exp = 0;
            while(a % i == 0)
            {
                ++ exp;
                a /= i;
            }
            exp *= b;
            sol = (1LL * sol * check((Pow(i % Mod, exp + 1) - 1)) * Pow((i - 1), Mod - 2)) % Mod;
        }
    }
    if(a > 1)
    {
        if(a % Mod == 1)
            sol = (sol * ((b + 1) % Mod)) % Mod;
        else
            sol = (1LL * sol * (check((Pow(a % Mod, b + 1) - 1)) * Pow((a - 1), Mod - 2))) % Mod;
    }
}
void write()
{
    printf("%lld\n", sol);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}