Cod sursa(job #2795526)

Utilizator guzgandemunteIonescu Laura guzgandemunte Data 6 noiembrie 2021 15:37:59
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MOD 9973
#define NMAX 1000000 // 10^6 * 10^6 = 10^12

using namespace std;
using ll = long long;

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

bool ciur[NMAX + 1];
vector <int> primes;
vector <int> desc;

void nrPrime()
{
    ciur[1] = 1;

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

    for (int d = 3; d * d <= NMAX; d += 2)
        if (!ciur[d])
            for (int i = d * d; i <= NMAX; i += d)
                ciur[i] = 1;

    for (int i = 2; i <= NMAX; ++i)
        if (!ciur[i]) primes.push_back(i);
}

void descompunere(ll x)
{
    ll nrDiv = 1, sumaExp, putere;
    int exponent, sumaDiv = 1;

    for (int i = 0; i < primes.size() && primes[i] * primes[i] <= x; i++)
        if (x % primes[i] == 0) {
            exponent = 0, putere = 1, sumaExp = 1;
            while (x % primes[i] == 0) {
                ++exponent;
                x /= primes[i];
                putere *= primes[i];
                sumaExp += putere;
            }
            nrDiv *= 1LL * (exponent + 1);
            sumaDiv = (1LL * sumaExp * sumaDiv) % MOD;
        }

    if (x > 1) {
        nrDiv *= 2;
        sumaDiv = (1LL * sumaDiv * (1 + x)) % MOD;
    }
    fout << nrDiv << " " << sumaDiv << '\n';
}
int main()
{
    int t;
    ll x;

    nrPrime();

    fin >> t;

    while (t--) {
        fin >> x;
        descompunere(x);
    }
}