Cod sursa(job #2771901)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 29 august 2021 23:55:53
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <vector>

using namespace std;

const int MODULO = 9973;
const int NMAX = 1000000;

bool ciur[1 + NMAX];

vector<int> nrPrime;

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

void initCiur()
{
    ciur[0] = true;
    ciur[1] = true;

    nrPrime.push_back(2);

    for (int i = 4; i <= NMAX; i += 2)
        ciur[i] = true;

    for (int i = 3; i <= NMAX; i += 2)
    {
        if (!ciur[i])
        {
            nrPrime.push_back(i);

            for (long long j = 1ll * i * i; j <= NMAX; j += i)
                ciur[j] = true;
        }
    }
}

int main()
{
    initCiur();

    int t;
    in >> t;

    while (t--)
    {
        int n;
        in >> n;

        int index = 0;

        int suma = 1;
        long long numar = 1;

        while (n > 1 && 1ll * nrPrime[index] * nrPrime[index] <= n)
        {
            int exp = 0;

            long long putere = 1;

            while (n % nrPrime[index] == 0)
            {
                n /= nrPrime[index];

                exp++;

                putere *= nrPrime[index];
            }

            if (exp > 0)
            {
                putere = putere * nrPrime[index];

                numar *= (exp + 1);
                suma = (suma * (putere - 1) / (nrPrime[index] - 1)) % MODULO;
            }

            index++;
        }

        if (n > 1)
        {
            numar *= 2;
            suma = (suma * (n + 1)) % MODULO;
            /// aici sus vine (n^2 - 1) / (n - 1), pentru ca n e ultimul numar prim cautat acum. Dar fractia aia este egala cu (n - 1)(n + 1) / (n - 1) = n + 1
        }

        out << numar << ' ' << suma << '\n';
    }

    return 0;
}