Cod sursa(job #3364435)

Utilizator realflaemStefan Andrei realflaem Data 3 septembrie 2026 14:14:16
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>
using namespace std;

const int MAXP = 1000001;
const long long MOD = 9973;

bool ciur[MAXP];
vector<int> primes;

void sieve() {
    for (int i = 2; i < MAXP; i++) ciur[i] = true;
    for (int i = 2; i < MAXP; i++) {
        if (ciur[i]) {
            for (long long j = (long long)i * i; j < MAXP; j += i)
                ciur[j] = false;
        }
    }
    for (int i = 2; i < MAXP; i++)
        if (ciur[i]) primes.push_back(i);
}

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

    sieve();

    int t;
    scanf("%d", &t);

    while (t--) {
        long long n;
        scanf("%lld", &n);

        long long numDiv = 1;
        long long sumDiv = 1;
        long long temp = n;

        for (int i = 0; i < (int)primes.size() && (long long)primes[i] * primes[i] <= temp; i++) {
            int p = primes[i];
            if (temp % p == 0) {
                int d = 0;
                long long pw = 1;
                while (temp % p == 0) {
                    temp /= p;
                    d++;
                    pw *= p;
                }
                numDiv *= (d + 1);

                // sum = 1 + p + p^2 + ... + p^d, mod 9973
                long long s = 0;
                long long cur = 1 % MOD;
                for (int k = 0; k <= d; k++) {
                    s = (s + cur) % MOD;
                    cur = (cur * (p % MOD)) % MOD;
                }
                sumDiv = (sumDiv * s) % MOD;
            }
        }

        if (temp > 1) {
            numDiv *= 2;
            long long s = (1 + temp % MOD) % MOD;
            sumDiv = (sumDiv * s) % MOD;
        }

        printf("%lld %lld\n", numDiv, sumDiv);
    }

    return 0;
}