Cod sursa(job #2985145)

Utilizator stefanrotaruRotaru Stefan-Florin stefanrotaru Data 25 februarie 2023 18:58:32
Problema Suma divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>

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

const long long MOD = 9901;
long long factPrim[20], expPrim[20];
long long nrPrim;

long long lgPut(long long a, long long b) {
    long long res = 1;
    a %= MOD;

    while(b) {
        if(b & 1) {
            res = (res * a) % MOD;
            b--;
        }
        a = (a * a) % MOD;
        b /= 2;
    }

    return res;
}

int main()
{
    long long a, b;
    f >> a >> b;

    /// 18 3
    /// 18    = 2 ^ 1 * 3 ^ 2
    /// 18^3  = 2 ^ 3 * 3 ^ 6
    if(a == 0) {
        g << 0;
        return 0;
    }

    if(a % 2 == 0) {
        factPrim[++nrPrim] = 2;
        while(a % 2 == 0) {
            a /= 2;
            expPrim[nrPrim]++;
        }
    }

    for(long long i = 3; i*i <= a; ++i) {
        if(a % i == 0) {
            factPrim[++nrPrim] = i;
            while(a % i == 0) {
                a /= i;
                expPrim[nrPrim]++;
            }
        }
    }

    if(a > 1) {
        factPrim[++nrPrim] = a;
        expPrim[nrPrim] = 1;
    }

    long long sum = 1;
    for(long long i = 1; i <= nrPrim; ++i) {
        expPrim[i] *= b;

        sum = (sum * lgPut(factPrim[i], expPrim[i] + 1) + MOD - 1) % MOD;
        sum = (sum * lgPut(factPrim[i] - 1, MOD - 2)) % MOD;
    }

    g << sum;

    return 0;
}