Cod sursa(job #3205238)

Utilizator tryharderulbrebenel mihnea stefan tryharderul Data 19 februarie 2024 09:40:05
Problema Suma divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 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) {
    return lgpow(x, MOD-2);
}

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

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

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

        if(d%MOD == 1) {
            ans = ans * (lgpow(d, p*m+1) - 1) % MOD;
        } else {
            ans = ans * (lgpow(d, p*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;
}