Cod sursa(job #3217171)

Utilizator stefan05Vasilache Stefan stefan05 Data 21 martie 2024 16:17:57
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <iostream>
#include <vector>

#define int long long
#define MOD 9901
#define VMAX 1000007

using namespace std;

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

int a, b;
int ans;
bool fCiur[VMAX];
vector<int> prime;
int d;

int explog(int, int);
void ciur();

signed main()
{
    ciur();
    fin >>a>>b;

    d = 2; ans = 1;
    int ind = 0;
    while (d*d <= a)
    {
        int counter = 0;
        while (a%d == 0)
            a /= d, counter ++;

        if (counter == 0)
        {
            d = prime[++ind];
            continue;
        }
        counter *= b;

        if (d % MOD == 1)
            ans = (ans * ((counter+1)%MOD)) % MOD;
        else
            ans = (ans * ((explog(d, counter+1)-1+MOD) % MOD * explog(d-1, MOD-2) % MOD)) % MOD;

        d = prime[++ind];
    }
    if (a > 1)
        if (a%MOD == 1)
            ans = (ans * ((b+1)%MOD)) % MOD;
        else
            ans = (ans * (((explog(a, b+1)-1+MOD) % MOD * explog(a-1, MOD-2))% MOD)) % MOD;

    fout <<ans<<'\n';
    fout.close();
    return 0;
}

void ciur()
{
    int i, j;
    fCiur[0] = fCiur[1] = 1;
    for (i = 2; i*i < VMAX; ++i)
    {
        if (!fCiur[i])
            for (j = i*i; j < VMAX; j += i)
                fCiur[j] = 1;
    }

    for (i = 2; i < VMAX; ++i)
        if (!fCiur[i])
            prime.push_back(i);
}

int explog(int n, int k)
{
    if (!k)
        return 1;

    int aux = explog(n, k/2);
    return (k%2? aux*aux%MOD*n%MOD: aux*aux%MOD);
}