Cod sursa(job #2982233)

Utilizator CristeaCristianCristea Cristian CristeaCristian Data 19 februarie 2023 18:50:05
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctime>

using namespace std;
ifstream cin("sumdiv.in");
ofstream cout("sumdiv.out");
using ll = unsigned long long;
//#define int ll
using pi = pair<int,int>;
using pll = pair<ll, ll>;

#define pb push_back
#define x first
#define y second
#define bg begin()
#define ed end()

const int MOD = 9901, INF = 1e9;
const char nl = '\n';
const int NMAX = 2e5+1;
int v[NMAX];
ll my_pow(ll b, ll e)
{
    ll p = 1;
    while(e)
    {
        if(e & 1)
        {
            p = p * b;
            while(p % MOD == 0 && p)
                p /= MOD;
            p = p % MOD;
        }
        b = b * b;
        while(b % MOD == 0 && b)
            b /= MOD;
        b = b % MOD;
        e /= 2;
    }
    return p;
}
void solve()
{
    ll a, b, i, ans = 1, num, den, cnt;
    cin >> a >> b;
    while(a % MOD == 0)
        a /= MOD;
    for(i = 2; i * i <= a; i++)
    {
        if(a % i == 0)
        {
            cnt = 0;
            while(a % i == 0)
            {
                a /= i;
                cnt++;
            }
            num = my_pow(i, cnt);
            num = my_pow(num, b);
            num = num * i;
            while(num % MOD == 0 && num)
                num /= MOD;
            num = num % MOD;
            num--;
            if(num <= 0)
                num += MOD;
            den = i - 1;
            if(den <= 0)
                den += MOD;
            while(num % MOD == 0 && num)
                num /= MOD;
            while(den % MOD == 0 && den)
                den /= MOD;
            ans = ans * num % MOD * my_pow(den, MOD - 2) % MOD;
        }
    }
    if(a != 1)
    {
        num = my_pow(a, b);
        num = num * a;
        while(num % MOD == 0 && num)
            num /= MOD;
        num = num % MOD;
        num--;
        if(num <= 0)
            num += MOD;
        den = a - 1;
        if(den <= 0)
            den += MOD;
        while(num % MOD == 0 && num)
            num /= MOD;
        while(den % MOD == 0 && den)
            den /= MOD;
        ans = ans * num % MOD * my_pow(den, MOD - 2) % MOD;
    }
    cout << ans;
}
int main()
{
    cin.tie(0)->sync_with_stdio(0);
    cin.exceptions(cin.failbit);
    int T;
    T = 1;
    while(T--)
        solve();
    return 0;
}