Cod sursa(job #2703703)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 9 februarie 2021 08:25:03
Problema Suma divizorilor Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
#define pb push_back
#define dbg(x) cerr << #x << " " << x << "\n"


const int MOD = 9901;
void add (int &a, int b) {
    a += b;
    if (a >= MOD)
        a -= MOD;
}
void sub (int &a, int b) {
    a -= b;
    if (a < 0)
        a += MOD;
}


int mult (int a, int b) {
    return a * b % MOD;
}

int lgput (int a, int b) {
    int ans = 1;
    while (b) {
        if (b & 1) ans = mult (ans, a);
        a = mult (a, a);
        b /= 2;
    }
    return ans;
}


int main () {
    freopen ("sumdiv.in", "r", stdin);
    freopen ("sumdiv.out", "w", stdout);
    int A, B;
    cin >> A >> B;
    int d = 2;
    vector <pair <int, int>> divisors;
    while (d * d <= A) {
        if (A % d == 0) {
            int ep = 0;
            while (A % d == 0)
                A /= d, ep++;
            divisors.pb ({d, ep});
        }
        d++;
    }
    if (A > 1)
        divisors.pb ({A, 1});
    int ans = 1;
    for (pair <int, int> d : divisors) {
        int e = d.second;
        int dv = d.first;
        int to_mult = lgput (dv, e * B + 1);
        sub (to_mult, 1);
        if (dv % MOD > 1)
            to_mult = mult (to_mult, lgput (dv - 1, MOD - 2));
        ans = mult (ans, to_mult);
    }
    cout << ans << "\n";
    return 0;
}