Cod sursa(job #3165021)

Utilizator eu_stiu_infoFerseta Matei eu_stiu_info Data 5 noiembrie 2023 09:21:11
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#define MOD 9901

using namespace std;

long long int a, b, d, cnt, result, c;

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

void euclid(int a, int b, int *d, int *x, int *y)
{
    if(b == 0)
    {
        *d = a;
        *x = 1;
        *y = 0;
    }
    else
    {
        int x0, y0;
        euclid(b, a % b, d, &x0, &y0);
        *x = y0;
        *y = x0 - (a / b) * y0;
    }
}

int inversmodular(int a, int b)
{
    int d, x, y;
    euclid(a, b, &d, &x, &y);
    while(x <= 0)
        x += b;
    return x;
}

long long int exp(long long int a, long long int b)
{
    long long int result;
    result = 1;
    while(b > 0)
    {
        if(b % 2 == 1)
            result = result * a % MOD;
        a = a * a % MOD;
        b /= 2;
    }

    if(result == 0)
        result = MOD;
    return result;
}

int main()
{
    fin >> a >> b;
    d = 2;
    cnt = 0;
    result = 1;
    while(a > 1)
    {
        cnt = 0;
        while(a % d == 0)
        {
            ++cnt;
            a /= d;
        }
        if(cnt > 0)
        {
            cnt *= b;
            c = (exp(d, cnt + 1) - 1) % MOD;
            if(d % MOD == 1)
                result = (result * (cnt + 1) % MOD) % MOD;
            else
                result = (result * (c * (inversmodular(d - 1, MOD) % MOD))) % MOD;
        }
        d++;
        if(d * d > a && a > 1)
            d = a;
    }
    fout << result << "\n";
    return 0;
}