Cod sursa(job #3319644)

Utilizator cezarica23cezar tambozi cezarica23 Data 2 noiembrie 2025 12:35:48
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;

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

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

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

int main() 
{
    ifstream cin("ssnd.in");
    ofstream cout("ssnd.out");
    vector<int> prim;
    for (int i = 2; 1LL*i*i <= 100000; i ++)
    {
        if (ciur[i] == false)
        {
            prim.push_back(i);
            for (int j = 1LL*i*i; j <= 100000; j += i)
            {
                ciur[j] = true;
            }
        }
    }
    int q; cin >> q;
    while (q --)
    {
        long long int a;
        cin>> a;
        int ans1 = 1, ans2 = 1;
        int copie = a;
        for (int i = 0; i < 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 *= (l + 1);
                ans1 %= MOD;
                int num = (exp(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 *= 2;
            ans1 %= MOD;
            int num = (exp(copie, 2) - 1 + MOD) % MOD;
            int den = (copie - 1 + MOD) % MOD;
            ans2 = 1LL * ans2 * num % MOD * inv_mod(den) % MOD;
        }
        cout << ans1 << ' ' << ans2 << '\n';
    
    }
}