Cod sursa(job #3235278)

Utilizator alex210046Bratu Alexandru alex210046 Data 16 iunie 2024 18:34:07
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>

using namespace std;

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

const int MOD = 9901;

int lgpow(int b, int p) {
    b %= MOD;
    int pow = 1;
    while(p){
        if(p & 1)
            pow = (pow * b) % MOD;
        b = (1LL * b * b) % MOD;
        p >>= 1;
    }

    return pow;
}

int invmod(int n) {
    return lgpow(n, MOD - 2);
}

int main() {
    int a, b;
    f >> a >> b;
    int rez = 1, d = 3, p = 0;
    while(!(a & 1)){
        a >>= 1;
        p++;
    }
    if(p) rez = rez * (lgpow(2, b * p + 1) + MOD - 1) % MOD;
    while(d * d <= a){
        p = 0;
        while(a % d == 0){
            a /= d;
            p++;
        }
        if(p){
            if(d % MOD == 1)
                rez = (rez * (p * b + 1)) % MOD;
            else if(d % MOD)
                rez = rez * (lgpow(d, p * b + 1) + MOD - 1) % MOD * invmod(d - 1) % MOD;
        }

        d += 2;
    }
    
    if(a > 1){
        if(a % MOD == 1)
            rez = (rez * (1 * b + 1)) % MOD;
        else if(a % MOD)
            rez = rez * (lgpow(a, 1 * b + 1) + MOD - 1) % MOD * invmod(a - 1) % MOD;
    }

    g << rez << '\n';

    f.close();
    g.close();
    return 0;
}