Cod sursa(job #3322555)

Utilizator FabianAndreiParaoanu Fabian Andrei FabianAndrei Data 14 noiembrie 2025 18:25:20
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <cmath>

using namespace std;
ifstream cin("sumdiv.in");
ofstream cout("sumdiv.out");
const int MOD = 9901;

long long fast_pow(long long base, long long exp)
{
    long long res = 1;
    base %= MOD;
    while (exp > 0)
    {
        if (exp % 2 == 1) res = (res * base) % MOD;
        base = (base * base) % MOD;
        exp /= 2;
    }
    return res;
}

long long mod_inverse(long long base)
{
    return fast_pow(base, MOD - 2);
}

long long sum_geometric_progression(long long p, long long N)
{
    if (N == 0) return 1 % MOD;
    if (p % MOD == 1) return (N + 1) % MOD;

    long long numerator = (fast_pow(p, N + 1) - 1 + MOD) % MOD;
    long long denominator_inverse = mod_inverse(p - 1);

    return (numerator * denominator_inverse) % MOD;
}

int main()
{


    long long A, B;
    cin >> A >> B;

    if (A == 0)
    {
        cout << 0 << endl;
        return 0;
    }

    if (B == 0)
    {
        cout << 1 % MOD << endl;
        return 0;
    }

    long long total_sum = 1;
    long long temp_A = A;

    for (long long i = 2; i * i <= temp_A; ++i)
    {
        if (temp_A % i == 0)
        {
            long long count = 0;
            while (temp_A % i == 0)
            {
                temp_A /= i;
                count++;
            }
            long long N = count * B;
            long long term_sum = sum_geometric_progression(i, N);
            total_sum = (total_sum * term_sum) % MOD;
        }
    }

    if (temp_A > 1)
    {
        long long N = 1 * B;
        long long term_sum = sum_geometric_progression(temp_A, N);
        total_sum = (total_sum * term_sum) % MOD;
    }

    cout << total_sum << endl;

    return 0;
}