Cod sursa(job #3205413)

Utilizator tryharderulbrebenel mihnea stefan tryharderul Data 19 februarie 2024 15:36:22
Problema Suma divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("sumdiv.in");
ofstream out("sumdiv.out");

const int MOD = 9901;

int n, m;
// BeginCodeSnip{Binary Exponentiation}
int exp(int x, int y) {
    int aux = x, ans = 1;
    for (int bit = 0; (1 << bit) <= y; bit++) {
        if ((1 << bit) & y) {
            ans = ans * aux % MOD;
        }
        aux = aux * aux % MOD;
    }
    return ans;
}
// EndCodeSnip

// BeginCodeSnip{Modular Inverse}
int inv(int x) {
    // The Modular Inverse only exists if x % MOD != 0
    if(x%MOD == 0) return 1;
    if (x <= 1) { return x; }
    return MOD - MOD / x * inv(MOD % x) % MOD;
}
// EndCodeSnip

int main() {
    in >> n >> m;

    // Prime Factorization
    long long div_sum = 1;
    for (int d = 2; d * d <= n; d++) {
        int p = 0;
        while (n % d == 0) {
            n /= d;
            p++;
        }

        if (!p) { continue; }
        p *= m;

        div_sum = div_sum * (exp(d, p * m + 1) + MOD - 1) * inv(d - 1) % MOD;

    }

    if (n > 1) {
        div_sum = div_sum * (exp(n, m + 1) + MOD - 1) * inv(n - 1) % MOD;
    }

    out << div_sum;
}