Pagini recente » Cod sursa (job #648160) | Cod sursa (job #3142515) | Borderou de evaluare (job #1830907) | Borderou de evaluare (job #1720104) | Cod sursa (job #2900886)
#include <bits/stdc++.h>
using namespace std;
auto primes_until(int limit)
{
vector<bool> is_prime(limit + 1, true);
is_prime[0] = false;
is_prime[1] = false;
vector<int> primes;
for (auto i = 0; i <= limit; ++i)
if (is_prime[i]) {
primes.push_back(i);
for (size_t j = i * i; j <= limit; j += i)
is_prime[j] = false;
}
return primes;
}
auto solve(const vector<int>& primes, long x)
{
const auto Mod = 9973;
auto exp = [] (int a, int b) {
if (b == 0)
return 1;
if (a == 0)
return 0;
int res = 1;
while (b) {
if (b & 0x1) {
res = (1l * res * a) % Mod;
--b;
}
a = (1l * a * a) % Mod;
b /= 2;
}
return res;
};
auto inv = [&] (int x) {
return exp(x, Mod - 2);
};
auto num_div = 1l;
auto sum_div = 1l;
for (auto p : primes) {
if (x % p)
continue;
auto cnt = 0;
do {
x /= p;
++cnt;
} while (x % p == 0);
num_div *= (cnt + 1);
sum_div *= 1l * ((exp(p, cnt + 1) - 1 + Mod) % Mod) * inv(p - 1) % Mod;
sum_div %= Mod;
if (x == 1)
break;
}
return make_pair(num_div, sum_div);
}
int main()
{
auto primes = primes_until(1e6);
ifstream in{"ssnd.in"};
ofstream out{"ssnd.out"};
int nt;
in >> nt;
while (nt--) {
long x;
in >> x;
auto [num_div, sum_div] = solve(primes, x);
out << num_div << ' ' << sum_div << '\n';
}
return 0;
}