Cod sursa(job #3301618)

Utilizator mewcatPetru Boca mewcat Data 28 iunie 2025 13:10:28
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

#define ll long long

const int maxv = 2000000;

int p[maxv + 10];

vector<int> primes;

void sieve()
{
    for (int j = 4; j <= maxv; j += 2)
    {
        p[j] = 1;
    }

    for (int i = 3; i * i <= maxv; i += 2)
    {
        if (!p[i])
        {
            for (int j = i * i; j <= maxv; j += i)
            {
                p[j] = 1;
            }
        }
    }

    primes.push_back(2);

    for (int i = 3; i <= maxv; i += 2)
    {
        if (!p[i]) {primes.push_back(i);}
    }
}

ll pow(ll b, ll e)
{
    if (e == 0) {return 1;}

    ll p = pow(b, e / 2);
    p *= p;

    if (e % 2 == 1) {p *= b;}

    return p;
}

pair<int, ll> calc(ll x)
{
    int p = 0;
    ll cnt = 0;
    ll sum = 0;

    while (x % 2 == 0)
    {
        x /= 2;
        p++;
    }

    cnt = p + 1;
    sum = (pow(2, p + 1) - 1) / (2 - 1);

    if (x == 1) {return {cnt, sum};}

    for (int d : primes)
    {
        p = 0;

        while (x % d == 0)
        {
            x /= d;
            p++;
        }

        cnt *= (p + 1);
        sum *= (pow(d, p + 1) - 1) / (d - 1);

        if (1ll * d * d > x)
        {
            p = 1;

            cnt *= 2;
            sum *= (x * x - 1 ) / (x - 1);

            return {cnt, sum};
        }
    }
}

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

    int n = 0;
    ll x = 0;
    pair<int, ll>  res;

    fin >> n;

    sieve();

    for (int i = 0; i < n; i++)
    {
        fin >> x;
        res = calc(x);
        fout << res.first << ' ' << res.second << '\n';
    }
}