Cod sursa(job #3201815)

Utilizator tryharderulbrebenel mihnea stefan tryharderul Data 9 februarie 2024 19:44:52
Problema Suma divizorilor Scor 30
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;

int lgpow(int x, int y) {
    int aux = x, ans = 1;
    for(int bit = 0; (1<<bit) <= y; bit++) {
        if((1<<bit) & y) {
            ans = 1LL * ans * aux % MOD;
        }
        aux = 1LL * 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;

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

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

    out << ans;

    return 0;
}