Cod sursa(job #2086076)

Utilizator rangal3Tudor Anastasiei rangal3 Data 11 decembrie 2017 13:00:43
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>
#define file "sumdiv"
#define MOD 9901
#define N 1000000

using namespace std;

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

typedef long long ll;

ll A,B;
ll p,d;

inline ll rid_log(ll A,ll B)
{
    if(B == 1) return A;
    if(B == 0) return 1;

    ll solus = rid_log(A,B/2);

    if(B%2) return ((solus*solus)% MOD *A ) % MOD;
        else return (solus*solus)%MOD;
}

ll inv_mod(ll X)
{
    return rid_log(X,MOD-2);
}

void solve()
{
    while(A%2 ==0) ++d,A/=2;

    ll sol = 1;

    if(d > 0)
        sol = sol * (rid_log(2,d*B+1) - 1);

    p = 3;
    do
    {
        d = 0;
        while(A%p == 0) ++d, A/=p;
        if(p * p <= A) p +=2;
            else p = A;

        if(d > 0)
            sol = (sol*(rid_log(p,d*B + 1) - 1) % MOD *inv_mod(p-1)) % MOD;
    } while(A > 1);

    fout<<sol<<"\n";
}

int main()
{
    fin>>A>>B;

    if( A == 0)
    {
        fout<<"0\n";
        return 0;
    }
    if( B == 0)
    {
        fout<<"1\n";
        return 0;
    }

    solve();

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