Cod sursa(job #3302389)

Utilizator MXelAMocanu Alexandru-Matei MXelA Data 7 iulie 2025 11:48:52
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
const int MOD = 9973;

int64 modexp(int64 a, int64 e, int mod=MOD){
    int64 r = 1 % mod;
    a %= mod;
    while(e){
        if(e & 1) r = r * a % mod;
        a = a * a % mod;
        e >>= 1;
    }
    return r;
}
int64 inv(int64 x){ // inverse modulo MOD (MOD e prim)
    return modexp(x, MOD - 2);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    // 1) generare primalitate până la 1e6
    const int MAXP = 1000000;
    vector<bool> sieve(MAXP+1, true);
    sieve[0] = sieve[1] = false;
    vector<int> primes;
    for(int i = 2; i <= MAXP; ++i) if(sieve[i]){
        primes.push_back(i);
        if((int64)i * i <= MAXP)
            for(int j = i * i; j <= MAXP; j += i)
                sieve[j] = false;
    }

    int T;
    cin >> T;
    while(T--){
        int64 n;
        cin >> n;
        int64 original = n;
        int64 numDiv = 1;
        int64 sumDivMod = 1; // ținem suma mod 9973

        for(int p : primes){
            if((int64)p * p > n) break;
            if(n % p == 0){
                int cnt = 0;
                while(n % p == 0){
                    n /= p;
                    cnt++;
                }
                numDiv *= (cnt + 1);

                // sumă = (p^(cnt+1) - 1) / (p - 1) mod MOD
                int64 term = (modexp(p, cnt + 1) - 1 + MOD) % MOD;
                term = term * inv(p - 1 + MOD) % MOD;

                sumDivMod = sumDivMod * term % MOD;
            }
        }
        if(n > 1){
            // rămâne un prim mare
            numDiv *= 2;
            int64 term = (modexp(n % MOD, 2) - 1 + MOD) % MOD;
            term = term * inv((n % MOD - 1 + MOD) % MOD) % MOD;
            sumDivMod = sumDivMod * term % MOD;
        }

        cout << numDiv << " " << sumDivMod << "\n";
    }
    return 0;
}