Cod sursa(job #3201810)

Utilizator tryharderulbrebenel mihnea stefan tryharderul Data 9 februarie 2024 19:35:18
Problema Suma divizorilor Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MOD = 9901;

int n, m;

int lgpow(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;
}

int inv(int x) {
    if(x <= 1) { return x; }
    return MOD - 1LL * MOD/x * inv(MOD%x) % MOD;
}

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

    int ans = 1;
    for(int d = 2; d * d <= n; d++) {
        int cnt = 0;
        while(n % d == 0) {
            n /= d;
            cnt++;
        }
        if(!cnt) { continue; }
        cnt *= m;

        ans = ans * (lgpow(d, (cnt+1)*m) - 1)* inv(d-1) % MOD;
    }

    if(n > 1) {
        ans = ans * (lgpow(n, m+1) - 1) * inv(n-1) % MOD;
    }
    
    out << ans;

    return 0;
}