Cod sursa(job #2735650)

Utilizator Mihai7218Bratu Mihai-Alexandru Mihai7218 Data 2 aprilie 2021 17:26:32
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
long long n, t, d, ndiv, sdiv, i, j, P[1000006], nprim;
bool ciur[1000006];
long long expsqr(long long n, long long p)
{
    if (p == 0) return 1;
    else if (p == 1) return n;
    else if (p % 2 == 0) return (expsqr(n*n, p/2));
    else if (p % 2 == 1) return (n*expsqr(n*n, (p-1)/2));
}
int main()
{
    ciur[0] = 1;
    ciur[1] = 1;
    for (i = 2; i < 1000005; i++)
    {
        if (ciur[i] == 0)
        {
            ++nprim;
            P[nprim] = i;
            for (j = 2*i; j < 1000005; j+=i)
                ciur[j] = 1;
        }
    }
    fin >> t;
    for (i = 1; i <= t; i++)
    {
        fin >> n;
        long long N = n;
        ndiv = 1; sdiv = 1;
        for (j = 1; j <= nprim && P[j]*P[j] <= N; j++)
        {
            if (N % P[j] == 0)
            {
                d = 0;
                while (N%P[j] == 0)
                {
                    d++;
                    N/=P[j];
                }
                ndiv *= (d+1);
                int p1 = (expsqr(P[j], d+1) - 1);
                int p2 = (P[j]-1);
                sdiv = (((sdiv*p1))/p2)%9973;
            }
        }
        if (N > 1)
        {
            ndiv *= 2;
            sdiv = (sdiv*(N+1)%9973);
        }
        fout << ndiv << " " << sdiv << "\n";
    }
    return 0;
}