Cod sursa(job #3153689)

Utilizator SSKMFSS KMF SSKMF Data 30 septembrie 2023 19:02:05
Problema Suma divizorilor Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
using namespace std;

ifstream cin ("sumdiv.in");
ofstream cout ("sumdiv.out");

const int mod = 9901;
int invers[9901];

int Exponentiere (int baza , int exponent)
{
    int rezultat = 1;
    while (exponent)
    {
        if (exponent & 1)
            (rezultat *= baza) %= mod;

        (baza *= baza) %= mod;
        exponent >>= 1;
    }

    return rezultat;
}

int main ()
{
    invers[0] = invers[1] = 1;
    for (int valoare = 2 ; valoare < mod ; valoare++)
        invers[valoare] = mod - (mod / valoare) * invers[mod % valoare] % mod;

    int valoare , factor_exponent;
    cin >> valoare >> factor_exponent;

    int suma = 0;
    for (int factor = 2 ; factor * factor <= valoare ; factor++)
        if (valoare % factor == 0)
        {
            int exponent = 0;
            while (valoare % factor == 0) {
                valoare /= factor;
                exponent++;
            }

            suma += (Exponentiere(factor , exponent * factor_exponent + 1) - 1) * invers[factor - 1] % mod;

            if (suma >= mod) suma -= mod;
            if (suma < 0) suma += mod;
        }

    if (valoare > 1)
    {
        suma += (Exponentiere(valoare , factor_exponent + 1) - 1) * invers[valoare - 1] % mod;

        if (suma >= mod) suma -= mod;
        if (suma < 0) suma += mod;
    }

    cout << suma;
    cout.close(); cin.close();
    return 0;
}