Cod sursa(job #3319643)

Utilizator gicaviitorulgica viitorul gicaviitorul Data 2 noiembrie 2025 12:32:20
Problema Suma si numarul divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 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 logaritm(int b, int v)
{
    int l = 0, r = 50;
    while (r - l > 1)
    {
        int mid = (l + r) / 2;
        int put = exp(b, mid);
        if (put <= v && v % put == 0)
            l = mid;
        else
            r = mid;
    }
    return l;
}


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

int main() 
{
    ifstream cin("ssnd.in");
    ofstream cout("ssnd.out");
    vector<long long 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;

        // parcurgem doar primele care au p*p <= a
        for (int i = 0; 1LL * prim[i] * prim[i] <= copie; i++)
        {
            int l = 0;
            if (copie % prim[i] == 0)
            {
                // calculăm exponentul factorului prim
                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;
            }
        }

        // dacă a ramas un factor prim mai mare ca sqrt(a)
        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';
    
    }
}