Cod sursa(job #3319660)

Utilizator gicaviitorulgica viitorul gicaviitorul Data 2 noiembrie 2025 13:34:50
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>
using namespace std;

#define int unsigned long long
const int MOD = 9901;

int expmod(int a, int k)
{
    int p = 1;
    while (k > 0)
    {
        if (k % 2 == 1)
        {
            p *= a;
            p %= MOD;
        }
        a *= a;
        a %= MOD;
        k /= 2;
    }
    return p;
}

int inv_mod(int a)
{
    return expmod(a, MOD - 2);
}



int sumdiv(int a, int b)
{
    if (a == 0) {
        
        return 0;
    }
    if (a == 1) {
        
        return 1;
    }

    
    vector<pair<int,int>> f;
    int n = a;
    for (int divv = 2; divv * divv <= n; ++divv)
    {
        if (n % divv == 0)
        {
            int put = 0;
            while (n % divv == 0) {
                n /= divv;
                ++put;
            }
            f.push_back({divv, put});
        }
    }
    if (n > 1) f.push_back({n, 1}); // factor prim ramas

    
    int allput = 1;

    
    const int EXP_MOD = MOD - 1;

    for (auto &it : f)
    {
        int p = it.first;
        int e = it.second;

        
        int eb = e * b % EXP_MOD;
        int exp_total = (eb + 1) % EXP_MOD;

        int num = expmod((int)(p % MOD), exp_total);  
        num = (num + MOD - 1) % MOD;                  

        int den = (int)((p % MOD + MOD) % MOD);
        den = (den + MOD - 1) % MOD;                  
        
        int inv = inv_mod(den);

        allput =( allput * num) % MOD;
        allput = (allput * inv) % MOD;
    }

    return allput;
}

signed main()
{
    ifstream cin("sumdiv.in");
    ofstream cout("sumdiv.out");

    int a, b;
    cin >> a >> b;

    
    cout << sumdiv(a, b);
}