Cod sursa(job #2883275)

Utilizator AndreiAlexandru2k3Ciucan Andrei Alexandru AndreiAlexandru2k3 Data 1 aprilie 2022 13:11:41
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <bitset>
using namespace std;

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

const int MOD = 9973,
          Rad12 = 1e6 + 1,
          Dim = 78499;

bitset<Rad12>ciur;
int Prime[Dim], poz;

long long N;
int T;

void ciur_Eratostene(int N)
{
    ciur[0] = ciur[1] = 1;
    for(int i = 4; i <= N; i += 2)
        ciur[i] = 1;
    for(int i = 3; i <= N; i += 2)
        if(!ciur[i])
            for(long long j = 1LL * i * i; j <= N; j += i)
                ciur[j] = 1;
    int nr = 0;
    for(int i = 1; i <= N; i++)
        if(!ciur[i])
            Prime[++poz] = i;

}


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 desc()
{
    long long NrDiv = 1, SumaDiv = 1;
    for(int i = 1; i <= poz && 1LL * Prime[i]*Prime[i] <= N; i++)
        if(N % Prime[i] == 0)
        {
            int exp = 0;
            do
            {
                exp++;
                N /= Prime[i];
            }
            while(N % Prime[i] == 0);
            NrDiv *= (exp + 1);
            SumaDiv = SumaDiv * (lgput(Prime[i], exp + 1) - 1) * invers_modular(Prime[i] - 1) % MOD;
        }
    if(N > 1)
    {
        NrDiv *= (1 + 1);
        SumaDiv = SumaDiv * (lgput(N, 1 + 1) - 1) * invers_modular(N - 1) % MOD;
    }
    if(SumaDiv < 0)
        SumaDiv += MOD;
    g << NrDiv << ' ' << SumaDiv << '\n';
}

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