Cod sursa(job #3161204)

Utilizator AleXutzZuDavid Alex Robert AleXutzZu Data 26 octombrie 2023 08:42:57
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 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.test(i)) {
            primes.push_back(i);
            for (int j = 2; j <= MAX_N / i; ++j) sieve.set(i * j);
        }
    }

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

        long long cnt_div = 1, sum_div = 1;

        for (int prime: primes) {
            int exp = 0;
            while (n % prime == 0) exp++, n /= prime;

            if (exp == 0) continue;

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

            if (prime * prime > n && n > 1) break;
        }
        if (!sieve.test(n)) {
            cnt_div = cnt_div * 2 % MOD;
            sum_div = sum_div * (pow(n, 2) - 1 + MOD) % MOD * inv(n - 1) % MOD;
        }

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