Cod sursa(job #3317669)

Utilizator TimofeiFilipTimofei Filip Emanuel TimofeiFilip Data 24 octombrie 2025 20:18:48
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>
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;

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);
}

unsigned long long RidicareLaPutereULL(unsigned long long baza, unsigned int exp) {
    unsigned long long rez = 1;
    while (exp) {
        if (exp & 1) rez *= baza;
        baza *= baza;
        exp >>= 1;
    }
    return rez;
}

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

    for (int i = 0; i < (int)primes.size() && 1ULL * primes[i] * primes[i] <= n; i++) {
        unsigned long long d = primes[i];
        unsigned int putere = 0;
        while (n % d == 0) {
            putere++;
            n /= d;
        }
        if (putere > 0) {
            // Compute sum for this prime power exactly (no mod)
            unsigned long long num = RidicareLaPutereULL(d, putere + 1) - 1;
            unsigned long long den = d - 1;
            unsigned long long part = num / den;
            sumdiv *= part;
            nrdiv *= (putere + 1);
        }
    }

    if (n > 1) {
        unsigned long long num = (n * n) - 1;
        unsigned long long den = n - 1;
        unsigned long long part = num / den;
        sumdiv *= part;
        nrdiv *= 2;
    }

    return {nrdiv % MOD, sumdiv % MOD};
}

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

    int t;
    unsigned long long n;
    scanf("%d", &t);

    ComputeSieve();

    while (t--) {
        scanf("%llu", &n);
        auto [nrdiv, sumdiv] = nrsumdiv(n);
        printf("%llu %llu\n", nrdiv, sumdiv);
    }

    return 0;
}