Cod sursa(job #3361785)

Utilizator realflaemStefan Andrei realflaem Data 28 iulie 2026 14:34:39
Problema Suma si numarul divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>
using namespace std;

const int MAX_N = 1000000;
const int MOD = 9973;

vector<pair<int,int>> factorize(int x, const vector<int>& spf)
{
    vector<pair<int,int>> factors;

    while (x > 1)
    {
        int p = spf[x];
        int exponent = 0;

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

        factors.push_back({p, exponent});
    }

    return factors;
}

long long power(long long base, long long exp)
{
    long long result = 1;

    while (exp > 0)
    {
        if (exp % 2)
            result = result * base % MOD;

        base = base * base % MOD;
        exp /= 2;
    }

    return result;
}

long long inverse(long long x)
{
    return power(x, MOD - 2);
}

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

    int T;
    fin >> T;

    vector<int> spf(MAX_N + 1);

    for (int p = 2; p <= MAX_N; p++)
    {
        if (spf[p] == 0)
        {
            spf[p] = p;

            if (1LL * p * p <= MAX_N)
            {
                for (long long multiple = 1LL * p * p;
                     multiple <= MAX_N;
                     multiple += p)
                {
                    if (spf[multiple] == 0)
                        spf[multiple] = p;
                }
            }
        }
    }

    while (T--)
    {
        int x;
        fin >> x;

        auto factors = factorize(x, spf);

        long long nrDiv = 1;
        long long sumDiv = 1;

        for (auto f : factors)
        {
            int p = f.first;
            int e = f.second;

            nrDiv = nrDiv * (e + 1) % MOD;

            long long numerator =
                (power(p, e + 1) - 1 + MOD) % MOD;

            long long denominator =
                inverse(p - 1);

            long long sumFactor =
                numerator * denominator % MOD;

            sumDiv = sumDiv * sumFactor % MOD;
        }

        fout << nrDiv << " " << sumDiv << '\n';
    }

    return 0;
}