Cod sursa(job #3355053)

Utilizator AsarguSargu Alexandru Asargu Data 21 mai 2026 17:39:34
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>

#define ll long long
#define ull unsigned ll

using namespace std;

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

const int NMAX = 1e6;
const int MOD = 9973;

int q;
bool sieve[NMAX + 1];
vector<int> primes;

void compute_sieve() {
    sieve[0] = sieve[1] = true;
    for(int i = 2; i * i <= NMAX; i++) {
        if(!sieve[i]) {
            for(int j = i + i; j <= NMAX; j += i) {
                sieve[j] = true;
            }
        }
    }

    for(int i = 2; i <= NMAX; i++) {
        if(!sieve[i]) {
            primes.push_back(i);
        }
    }
}

int Power(ll a, int b) {
    a %= MOD;
    int P = 1;
    while(b) {
        if(b % 2 == 1) {
            P = (ll)P * a % MOD;
        }
        a = (ll)a * a % MOD;
        b /= 2;
    }
    return P;
}

void get_prime_factors(ll n, int &cnt_divs, int &sum_divs) {
    cnt_divs = 1;
    sum_divs = 1;

    int j = 0;
    ll d = primes[j++];
    int sz = primes.size();
    while(n > 1 && j < sz) {
        int e = 0;
        while(n % d == 0) {
            n /= d;
            e++;
        }
        if(e) {
            cnt_divs *= (e + 1);
            int add = 0;
            for(int i = 0; i <= e; i++) {
                 add = ((ll)add + Power(d, i)) % MOD;
            }
            sum_divs = ((ll)sum_divs * add) % MOD;
        }

        d = primes[j++];
        if(d * d > n) {
            d = n;
        }
    }
}

int main() {
    compute_sieve();

    fin >> q;
    while(q--) {
        ll n;
        int cnt_divs, sum_divs;

        fin >> n;
        get_prime_factors(n, cnt_divs, sum_divs);
        fout << cnt_divs << " " << sum_divs << '\n';
    }

    return 0;
}