Cod sursa(job #2883253)

Utilizator AndreiAlexandru2k3Ciucan Andrei Alexandru AndreiAlexandru2k3 Data 1 aprilie 2022 12:46:53
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

const int MOD = 9973;

int lgput(int x, int n)
{
    int val = 1;
    while(n)
    {
        if(n & 1)
            val = 1LL * val * x % MOD;
        x = 1LL * x * x % MOD;
        n >>= 1;
    }
    return val;
}

inline int invers_modular(int x)
{
    return lgput(x, MOD - 2);
}

void divizor_prim(long long &N, int d, long long &NrDiv, long long &SumaDiv)
{
    if(N % d == 0)
    {
        int exp = 0;
        do
        {
            exp++;
            N /= d;
        }
        while(N % d == 0);
        NrDiv *= (exp + 1);
        SumaDiv = SumaDiv * (lgput(d, exp + 1) - 1) * invers_modular(d - 1) % MOD;
    }

}

void desc(long long N)
{
    long long NrDiv = 1, SumaDiv = 1;
    divizor_prim(N, 2, NrDiv, SumaDiv);
    for(int d = 3; 1LL * d * d <= N; d += 2)
        divizor_prim(N, d, NrDiv, SumaDiv);
    if(N > 1)
        divizor_prim(N, N, NrDiv, SumaDiv);
    if(SumaDiv < 0)
        SumaDiv += MOD;
    g << NrDiv << ' ' << SumaDiv << '\n';
}

int main()
{
    int T;
    f >> T;
    while(T--)
    {
        long long N;
        f >> N;
        desc(N);
    }
    f.close();
    g.close();
    return 0;
}