Cod sursa(job #3317367)

Utilizator filipdanieloanFilip-Daniel Oancea filipdanieloan Data 23 octombrie 2025 13:50:38
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>
using namespace std;

#define int long long

constexpr int MOD = 9973;
bitset<1000001> isPrime;
vector<int> prime;



void erathostenes()
{
    for(int i = 0; i <= 1000000; ++i)
        isPrime[i] = true;
    isPrime[0] = isPrime[1] = false;

    for(int i = 2; i * i <= 1000000; ++i)
        if(isPrime[i])
            for(int j = i * i; j <= 1000000; j += i)
                isPrime[j] = false;

    for(int i = 2; i <= 1000000; ++i)
        if(isPrime[i])
            prime.push_back(i);
}

int lgput(int a, int n)
{
    int p = 1;
    a %= MOD;
    for(; n; n >>= 1) {
        if(n & 1)
            p = p * a % MOD;
        a = a * a % MOD;
    }
    return p % MOD;
}

int invMod(int x)
{
    return lgput(x, MOD-2);
}

void solve()
{
    int n;
    cin >> n;

    long long sum = 1, nr = 1;

    int i = 0;
    for(; i < prime.size() && 1LL * prime[i] * prime[i] <= n; ++i) {
        int p = 0;
        while(n % prime[i] == 0) {
            n /= prime[i];
            ++p;
        }
        if(p) {
            nr *= p + 1;
            sum = sum * (lgput(prime[i], p + 1) - 1) % MOD * invMod(prime[i]-1);
        }
    }

    if(n > 1) {
        nr *= 2;
        sum = sum * (n * n - 1) % MOD * invMod(n-1) % MOD;
    }

    cout << nr << ' ' << sum << '\n';
}

signed main()
{
#ifndef LOCAL
    cin.tie(nullptr)->sync_with_stdio(false);
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
#endif

    erathostenes();

    int t;
    cin >> t;
    while(t--)
        solve();
}