Cod sursa(job #2928794)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 23 octombrie 2022 21:32:05
Problema Suma divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>

using namespace std;

#define Nmax 7071
#define MOD 9901

bool ciur[Nmax + 1];

void lgput(int nr, int pow, int &rez)
{
    if(pow == 0)
    {
        rez = 1;
        return;
    }

    lgput(((long long)nr * nr) % MOD, pow / 2, rez);

    if(pow % 2 == 1)
    {
        rez = ((long long)rez * nr) % MOD;
    }
}

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

    int a, b, i, cnt, sol, rez;
    long long j;

    fin >> a >> b;

    sol = 1;
    for(i = 2; i * i <= Nmax && a > 1; i++)
    {
        if(ciur[i] == 0)
        {
            if(a % i == 0)
            {
                cnt = 0;
                while(a % i == 0)
                {
                    a /= i;
                    cnt++;
                }

                cnt = (cnt * b) % MOD;

                lgput(i, cnt + 1, rez);
                sol = ((long long)sol * (rez - 1) / (i - 1)) % MOD;
            }


            for(j = (long long)i * i; j <= Nmax; j += i)
            {
                ciur[j] = 1;
            }
        }
    }

    if(a > 1)
    {
        lgput(a, b + 1, rez);
        sol = ((long long)sol * (rez - 1) / (a - 1)) % MOD;
    }

    fout << sol;

    return 0;
}