Cod sursa(job #2550246)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 18 februarie 2020 17:09:21
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <vector>
#include <cstdio>

using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

const int SQRT = 1e6;
const int MOD = 9973;

long long N;

int d[SQRT + 5];

int nrp, primes[SQRT + 5];

int nrDiv, sumaDiv;

void Erathostenes()
{
    for(int i = 3; i * i <= SQRT; i += 2)
        if(!d[i])
        {
            for(int j = i * i; j <= SQRT; j += 2 * i)
                d[j] = 1;
        }

    primes[++nrp] = 2;
    for(int i = 3; i <= SQRT; i += 2)
        if(!d[i])
            primes[++nrp] = i;
}

void Solve()
{
    nrDiv = 1;
    sumaDiv = 1;

    fin >> N;

    for(int i = 1; i <= nrp; i++)
        if(1LL * primes[i] * primes[i] > N)
            break;
        else
        {
            int div = 1LL * primes[i];
            int exp = 0;

            long long aux = 1;
            long long addSum = 1;

            while(N % div == 0)
            {
                N /= div;
                exp++;

                aux *= div;
                aux %= MOD;

                addSum += aux;
                addSum %= MOD;
            }

            nrDiv *= (exp + 1);
            sumaDiv *= addSum;

            nrDiv %= MOD;
            sumaDiv %= MOD;
        }

    if(N != 1)
    {
        nrDiv *= 2;
        sumaDiv *= (1 + N);

        nrDiv %= MOD;
        sumaDiv %= MOD;
    }

    fout << nrDiv << ' ' << sumaDiv << '\n';
}

int main()
{
    Erathostenes();

    int t;
    fin >> t;

    while(t--)
        Solve();

    return 0;
}