Cod sursa(job #2756473)

Utilizator TraianQTraianQ TraianQ Data 31 mai 2021 20:54:55
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <bitset>
#include <vector>

using namespace std;

const int MOD = 9901;
const int VMAX = 8000;

bitset <VMAX+1> c;
vector <int> prime;
int inv[MOD];

void ciur()
{
    for (int i = 2; i * i <= VMAX; i++)
    {
        if (!c[i])
        {
            for (int j = i * i; j <= VMAX; j += i)
            {
                c[j] = 1;
            }
        }
    }
    for (int i = 2; i <= VMAX; i++)
    {
        if (!c[i])
        {
            prime.push_back(i);
        }
    }
}

long long putere(long long a, long long n)
{
    a%=MOD;
    long long p = 1;
    while (n != 0)
    {
        if (n % 2 != 0)
        {
            p = (p * a) % MOD;
        }
        a = (a * a) % MOD;
        n /= 2;
    }
    return p;
}

void invers_mod()
{
    for (int i = 1; i < MOD; i++)
    {
        inv[i] = putere(i, MOD - 2);
    }
}

int main()
{
    ifstream in("sumdiv.in");
    ofstream out("sumdiv.out");
    ciur();
    invers_mod();
    long long n,b, nrd = 1, sumd = 1;
    in >> n >> b;
    int i = 0;
    while (i < prime.size() && prime[i] * prime[i] <= n)
    {
        if (n % prime[i] == 0)
        {
            int p = 0;
            while (n % prime[i] == 0)
            {
                p++;
                n /= prime[i];
            }
            p=p*b;
            sumd *= (putere(prime[i], p + 1) + MOD - 1);
            sumd %= MOD;
            int numitor = (prime[i] - 1 + MOD)%MOD;
            sumd *= inv[numitor];
            sumd %= MOD;
        }
        i++;
    }
    if (n != 1)
    {
        sumd *= (putere(n, b + 1) + MOD - 1);
        sumd %= MOD;
        sumd *= inv[(n - 1 + MOD) % MOD];
        sumd %= MOD;
    }
    out << sumd << "\n";
    return 0;
}