Cod sursa(job #3357784)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 14:50:05
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>

constexpr const long long MOD = 9973;
constexpr const int MAX_N = 1e6;

long long pow(long long base, long long exponent) {
    long long ans = 1;
    while (exponent > 0) {
        if (exponent & 1) ans = ans * base % MOD;
        exponent >>= 1;
        base = base * base % MOD;
    }
    return ans;
}

long long inv(long long num) {
    return pow(num, MOD - 2);
}

int main() {
    std::ifstream input("ssnd.in");
    std::ofstream output("ssnd.out");

    std::bitset<MAX_N + 1> sieve;
    std::vector<int> primes;

    sieve[0] = sieve[1] = true;

    for (int i = 2; i <= MAX_N; ++i) {
        if (!sieve[i]) {
            primes.push_back(i);
            for (long long j = (long long)i * i; j <= MAX_N; j += i) {
                sieve.set(j);
            }
        }
    }

    int t;
    input >> t;
    while (t--) {
        long long n;
        input >> n;

        long long cnt_div = 1, sum_div = 1;

        for (int prime : primes) {
            if ((long long)prime * prime > n) break;
            if (n % prime != 0) continue;

            int exp = 0;
            while (n % prime == 0) {
                exp++;
                n /= prime;
            }

            cnt_div = cnt_div * (exp + 1) % MOD;
            long long power = pow(prime, exp + 1);
            sum_div = sum_div * ((power - 1 + MOD) % MOD) % MOD;
            sum_div = sum_div * inv(prime - 1) % MOD;
        }

        if (n > 1) {
            cnt_div = cnt_div * 2 % MOD;
            long long power = pow(n, 2);
            sum_div = sum_div * ((power - 1 + MOD) % MOD) % MOD;
            sum_div = sum_div * inv(n - 1) % MOD;
        }

        output << cnt_div << " " << sum_div << '\n';
    }
    return 0;
}