Cod sursa(job #3317670)

Utilizator TimofeiFilipTimofei Filip Emanuel TimofeiFilip Data 24 octombrie 2025 20:21:54
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <cstdio>
#include <utility>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;

const int MOD = 9973;
const int NMAX = 1000000;
const bool PRIM = 0;
const bool COMPUS = 1;

bool Sieve[NMAX + 10];
vector<int> primes;

long long RidicareLaPutere(long long baza, long long exponent) {
    long long rez = 1;
    while (exponent != 0) {
        if (exponent % 2 != 0)
            rez = rez * baza;
        baza = baza * baza;
        exponent /= 2;
    }
    return rez;
}

void ComputeSieve() {
    Sieve[0] = Sieve[1] = COMPUS;
    for (int i = 2; i * i <= NMAX; i++) {
        if (Sieve[i] == PRIM) {
            for (int j = i * i; j <= NMAX; j += i)
                Sieve[j] = COMPUS;
        }
    }
    for (int i = 2; i <= NMAX; i++)
        if (Sieve[i] == PRIM)
            primes.push_back(i);
}

pair<long long,long long> nrsumdiv(unsigned long long n) {
    int nrdiv;
    long long sumdiv;
    nrdiv = sumdiv = 1;

    int i = 0;
    long long putere;

    while (n != 1) {
        long long d = primes[i] * 1LL;
        putere = 0;
        while (n % d == 0) {
            putere++;
            n /= d;
        }
        
        long long num = RidicareLaPutere(d, putere + 1) - 1;
        long long den = d - 1;
        sumdiv = (sumdiv * (num / den)) % MOD;
        nrdiv *= (putere + 1);

        i++;
        if (i >= (int)primes.size()) break; // safety stop
    }
    return {nrdiv, sumdiv};
}

int main() {
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);

    int t;
    unsigned long long n;

    scanf("%d", &t);

    ComputeSieve();

    for (; t > 0; --t) {
        scanf("%llu", &n);
        pair<long long, long long> res = nrsumdiv(n);
        printf("%lld %lld\n", res.first % MOD, res.second % MOD);
    }
    return 0;
}