Cod sursa(job #2735733)

Utilizator Mihai7218Bratu Mihai-Alexandru Mihai7218 Data 2 aprilie 2021 19:11:08
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 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)
{
    n = n%9973;
    if (p == 0) return 1;
    else if (p == 1) return n%9973;
    else if (p % 2 == 0) return (expsqr(n*n, p/2))%9973;
    else if (p % 2 == 1) return (n*expsqr(n*n, (p-1)/2))%9973;
    return 1;
}
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 && 1LL*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))%9973;
                int p2 = (expsqr((P[j]-1), 9971))%9973;
                sdiv = 1LL*(((sdiv*p1)%9973)*p2)%9973;
            }
        }
        if (N > 1)
        {
            ndiv *= 2;
            sdiv = (1LL*sdiv*(N+1)%9973);
        }
        fout << ndiv << " " << sdiv << "\n";
    }
    return 0;
}