Cod sursa(job #2528563)

Utilizator dey44andIoja Andrei-Iosif dey44and Data 22 ianuarie 2020 09:52:13
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>

#define input "sumdiv.in"
#define output "sumdiv.out"
#define NMAX 100005
#define MOD 9901

using namespace std;
typedef long long ll;

ifstream in(input);
ofstream out(output);

ll B, E;
vector < ll > primes;
bool uz[NMAX];

ll fasto_expo(ll base, ll exp)
{
    if(!exp) return 1;
    if(exp == 1) return base % MOD;
    if(exp % 2 == 1) return base % MOD * fasto_expo(base * base % MOD, exp / 2) % MOD;
    return fasto_expo(base * base % MOD, exp / 2) % MOD;
}

void Erastostene()
{
    primes.push_back(2);
    for(int i = 3; i <= NMAX - 5; i += 2)
        if(!uz[i])
        {
            primes.push_back(i);
            for(int j = 3 * i; j <= NMAX - 5; j+= 2 * i)
                uz[i] = 1;
        }
}

void Read_Data()
{
    in >> B >> E;
    Erastostene();
}

void Solve()
{
    ll sum = 1;
    unsigned pivot;
    for(pivot = 0; primes[pivot] * primes[pivot] <= B; pivot++)
    {
        ll expp = 0;
        while(B % primes[pivot] == 0) B /= primes[pivot], expp++;
        if(expp)
        {
            //out << primes[pivot] << " " << expp * E + 1 << "\n";
            ll Num = fasto_expo(primes[pivot], expp * E + 1) - 1;
            if(Num <= 0) Num += MOD;
            ll Nim = fasto_expo(primes[pivot] - 1, MOD - 2);
            if(Nim < 0) Nim += MOD;
            //out << Num << " " << Nim << "\n\n";
            sum = (sum * Num) % MOD * Nim % MOD;
        }
    }
    if(B > 1)
    {
        //out << B << " " << E + 1 << "\n";
        ll Num = fasto_expo(B, E + 1) - 1;
        if(Num <= 0) Num += MOD;
        ll Nim = fasto_expo(B - 1, MOD - 2);
        if(Nim < 0) Nim += MOD;
        //out << Num << " " << Nim << "\n\n";
        sum = ((sum * Num) % MOD) * Nim % MOD;
    }
    out << sum << "\n";
}

int main()
{
    Read_Data();
    Solve();
    return 0;
}