Pagini recente » Cod sursa (job #2695734) | Cod sursa (job #3270304) | Cod sursa (job #1404654) | Borderou de evaluare (job #1569591) | Cod sursa (job #3161204)
#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;
}