Cod sursa(job #3250884)

Utilizator tmxmatTudor Matasaru Mihai tmxmat Data 24 octombrie 2024 04:47:11
Problema Suma divizorilor Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>

using namespace std;

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

#define mod 9901

long long pow(long long n, long long p)
{
    if (p == 0)
    {
        return 1;
    }
    else if (p == 1)
    {
        return n;
    }
    else if (p % 2 == 0)
    {
        return pow(((n % mod) * (n % mod)) % mod, p / 2) % mod;
    }
    else if (p % 2 != 0)
    {
        return ((n % mod) * (pow(((n % mod) * (n % mod)) % mod, (p - 1) / 2) % mod)) % mod;
    }
}

long long invMod(long long val)
{
    return pow(val, mod - 2); /// Mica teorema a lui Fermat: (a^p - a) % p = 0
}

int main()
{
    long long a, b;
    cin >> a >> b;
    long long exp = 0;
    long long sumdiv = 1;
    while (a % 2 == 0)
    {
        a /= 2;
        exp ++;
    }
    if (exp != 0)
    {
        if (2 % mod == 1)
        {
            sumdiv = sumdiv * (exp * b + 1) % mod;
        }
        else
        {
            sumdiv = sumdiv * (pow(2, exp * b + 1) - 1) % mod * invMod(2 - 1) % mod;
        }
    }
    for (long long i = 3; i * i <= a; i += 2)
    {
        exp = 0;
        while (a % i == 0)
        {
             a /= i;
             exp ++;
        }
        if (exp != 0)
        {
            if (i % mod == 1)
            {
                sumdiv = sumdiv * (exp * b + 1) % mod;
            }
            else
            {
                sumdiv = sumdiv * (pow(i, exp * b + 1) - 1) % mod * invMod(i - 1) % mod;
            }
        }
    }
    if (a != 1)
    {
        if (a % mod == 1)
        {
            sumdiv = sumdiv * (1 * b + 1) % mod;
        }
        else
        {
            sumdiv = sumdiv * (pow(a, 1 * b + 1) - 1) % mod * invMod(a - 1) % mod;
        }
    }
    cout << sumdiv;
    return 0;
}