Cod sursa(job #3319645)

Utilizator cezarica23cezar tambozi cezarica23 Data 2 noiembrie 2025 12:40:09
Problema Suma si numarul divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
using namespace std;

const int MOD = 9973;
bool ciur[1000005];

int expmod(int a, long long k)
{
    int p = 1;
    while (k > 0)
    {
        if (k % 2 == 1)
        {
            p = 1LL * p * a % MOD;
        }
        a = 1LL * a * a % MOD;
        k /= 2;
    }
    return p;
}

int inv_mod(int a)
{
    return expmod(a, MOD - 2);
}

int main() 
{
    ifstream cin("ssnd.in");
    ofstream cout("ssnd.out");
    vector<int> prim;
    for (int i = 2; 1LL * i * i <= 1000000; i++)
    {
        if (!ciur[i])
        {
            prim.push_back(i);
            for (long long j = 1LL * i * i; j <= 1000000; j += i)
                ciur[j] = true;
        }
    }
    int q; 
    cin >> q;
    while (q--)
    {
        long long a;
        cin >> a;
        int ans1 = 1, ans2 = 1;
        long long copie = a;
        for (int i = 0; i < (int)prim.size() && 1LL * prim[i] * prim[i] <= copie; i++)
        {
            int l = 0;
            if (copie % prim[i] == 0)
            {
                while (copie % prim[i] == 0)
                {
                    copie /= prim[i];
                    l++;
                }
                ans1 = 1LL * ans1 * (l + 1) % MOD;
                int num = (expmod(prim[i], l + 1) - 1 + MOD) % MOD;
                int den = (prim[i] - 1 + MOD) % MOD;
                ans2 = 1LL * ans2 * num % MOD * inv_mod(den) % MOD;
            }
        }
        if (copie > 1)
        {
            ans1 = 1LL * ans1 * 2 % MOD;
            int num = (expmod(copie % MOD, 2) - 1 + MOD) % MOD;
            int den = (copie % MOD - 1 + MOD) % MOD;
            ans2 = 1LL * ans2 * num % MOD * inv_mod(den) % MOD;
        }
        cout << ans1 << ' ' << ans2 << '\n';
    }
    return 0;
}