Cod sursa(job #3151835)

Utilizator alexvali23alexandru alexvali23 Data 22 septembrie 2023 23:59:16
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>

using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
const int NMAX = 1000000;
bool v[NMAX + 1];
int nPrime[NMAX + 1];
const int MOD = 9973;
unsigned long long RidicareLogaritmica(unsigned long long N, unsigned long long P)
{
    unsigned long long r = 1;
    N %= MOD;
    while(P)
    {
        if(P % 2 == 1)
            r = (1ULL * r * N) % MOD;
        N = (1ULL * N * N) % MOD;
        P = P / 2;
    }
    return r;
}
void ciur(int n)
{
    int i, j;
    v[0] = v[1] = 1;
    for(i = 4; i <= n; i += 2)
        v[i] = 1;
    for(i = 3; i * i <= n; i += 2)
    {
        if(v[i] == 0)
        {
            for(j = i * i; j <= n; j += i)
                v[j] = 1;
        }
    }
    int nDiv = 1;
    nPrime[nDiv] = 2;
    for(int i = 3; i <= n; i += 2)
        if(v[i] == 0)
            nPrime[++nDiv] = i;
    //g << nDiv;
}
int Putere(int A, int n)
{
    int P = 1;
    while(n)
    {
        if(n % 2 == 1)
            P = P * A;
        A = A * A;
        n /= 2;
    }
    return P;
}
int main()
{
    ciur(NMAX + 1);
    int t;
    long long n;
    f >> t;
    for(int i = 1; i <= t; i++)
    {
        f >> n;
        int nrd = 1;
        unsigned long long ndv = 1, sumDiv = 1;
        while(n > 1)
        {
            int div = nPrime[nrd];
            if(n %  div == 0)
            {
                int pow = 0;
                while(n % div == 0)
                {
                    pow++;
                    n /= div;
                }
                ndv *= (pow + 1);
                sumDiv *= ((RidicareLogaritmica(div, pow + 1) - 1) / (div - 1)) % MOD;
            }
            nrd++;
        }
        g << ndv << ' ' << sumDiv << '\n';
    }
    return 0;
}