Cod sursa(job #3233458)

Utilizator MirceaDonciuLicentaLicenta Mircea Donciu MirceaDonciuLicenta Data 3 iunie 2024 15:01:06
Problema Suma divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>

using namespace std;

const int MOD = 9901;

// Funcție pentru a calcula exponențierea modulară
long long modExp(long long base, long long exp, long long mod) {
    long long result = 1;
    while (exp > 0) {
        if (exp % 2 == 1) {
            result = (result * base) % mod;
        }
        base = (base * base) % mod;
        exp /= 2;
    }
    return result;
}

// Funcție pentru a calcula suma puterilor divizorilor primi
long long sumPrimePowers(long long p, long long e) {
    if (e == 0) return 1;
    if (e == 1) return (1 + p) % MOD;
    long long half = sumPrimePowers(p, e / 2);
    long long sum = (half * (1 + modExp(p, e / 2 + 1, MOD))) % MOD;
    if (e % 2 == 1) {
        sum = (sum + modExp(p, e, MOD)) % MOD;
    }
    return sum;
}

// Funcție pentru a calcula suma divizorilor lui A^B
long long sumDivisors(long long A, long long B) {
    long long result = 1;
    for (long long i = 2; i * i <= A; ++i) {
        if (A % i == 0) {
            long long count = 0;
            while (A % i == 0) {
                A /= i;
                count++;
            }
            result = (result * sumPrimePowers(i, count * B)) % MOD;
        }
    }
    if (A > 1) {
        result = (result * sumPrimePowers(A, B)) % MOD;
    }
    return result;
}

int main() {
    ifstream inFile("sumdiv.in");
    ofstream outFile("sumdiv.out");

    long long A, B;
    inFile >> A >> B;

    long long result = sumDivisors(A, B) % MOD;

    outFile << result << endl;

    inFile.close();
    outFile.close();

    return 0;
}