Cod sursa(job #3121711)

Utilizator Raul_AArdelean Raul Raul_A Data 14 aprilie 2023 21:59:01
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>
//#define fin cin
//#define fout cout
#define ull unsigned long long
using namespace std;

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

const int MOD = 9901;

ull lgput(ull b, ull e, ull mod) {
    ull pow = 1;
    b %= mod;
    while(e){
        if(e & 1)
            pow = (pow * b) % mod;
        b = (b * b) % mod;
        e >>= 1;
    }

    return pow;
}

ull invmod(ull a, ull mod) {
    return lgput(a, mod - 2, mod);
}

int main() {
    ull a, b;
    fin >> a >> b;
    if(a==0)
    {
        fout<<0;
        return 0;
    }
    ull sum_div = 1, d = 3, p = 0;
    while(a%2==0){
        a >>= 1;
        ++p;
    }
    if(p){
        sum_div = sum_div * (lgput(2, b * p + 1, MOD) + MOD - 1) % MOD;
        sum_div = sum_div * invmod(1, MOD) % MOD;
    }

    while(d * d <= a){
        p = 0;
        while(a % d == 0){
            a /= d;
            ++p;
        }
        if(p)
            sum_div = sum_div * (lgput(d, p * b + 1, MOD) + MOD - 1) % MOD * invmod(d - 1, MOD) % MOD;

        d += 2;
    }

    if(a > 1)
        sum_div = sum_div * (lgput(a, 1 * b + 1, MOD) + MOD - 1) % MOD * invmod(a - 1, MOD) % MOD;

    fout << sum_div << '\n';

    /*fin.close();
    fout.close();*/
    return 0;
}