Pagini recente » Cod sursa (job #3317852) | Cod sursa (job #138971) | Cod sursa (job #3310293) | Cod sursa (job #2335151) | Cod sursa (job #3314764)
#include <bits/stdc++.h>
using namespace std;
#define i16 int16_t
#define i32 int32_t
#define i64 int64_t
#define GUARD(expr) \
do { \
if (!(expr)) { \
return 1; \
} \
} while (0)
constexpr i32 MAX = 1'000'000;
static_assert(i64(MAX) * MAX == INT64_C(1'000'000'000'000));
constexpr i16 MOD = 9'973;
pair<i32, i32> solve(i64 n, const vector<i32>& primes,
const array<i32, MOD>& inverse) {
vector<pair<i32, i16>> k;
for (i32 p : primes) {
if (!(n % p)) {
i16 e{1};
for (n /= p; n % p == 0; n /= p) {
++e;
}
k.emplace_back(p, e);
}
}
if (n > 1) {
k.emplace_back(n, 1);
}
i32 c{1};
i32 s{1};
auto exp = [](i32 p, i16 e) {
i32 x{1};
p %= MOD;
for (; e;) {
if (e & 1) {
x = (x * p) % MOD;
}
p = (p * p) % MOD;
e >>= 1;
}
return x;
};
for (auto [p, e] : k) {
s = (s *
(((exp(p, e + 1) - 1 + MOD) % MOD) * inverse[(p - 1) % MOD] % MOD)) %
MOD;
c = (c * (e + 1)) % MOD;
}
return {c, s};
}
int main() {
array<i32, MOD> inverse{};
inverse[1] = 1;
for (int i = 2; i < MOD; ++i) {
inverse[i] = (MOD - (MOD / i) * inverse[MOD % i] % MOD) % MOD;
}
bitset<MAX + 1> sieve{};
sieve[0] = sieve[1] = 1;
for (i64 p = 2; p * p <= MAX; ++p) {
if (!sieve[p]) {
for (i64 q = p * p; q <= MAX; q += p) {
sieve[q] = 1;
}
}
}
vector<i32> primes{};
for (i32 i = 2; i <= MAX; ++i) {
if (!sieve[i]) {
primes.push_back(i);
}
}
#ifndef LOCAL
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(nullptr);
i64 T;
GUARD(cin >> T && 1 <= T && T <= 1'000);
for (; T--;) {
i64 N;
GUARD(cin >> N && 1 <= N && N <= 1'000'000'000'000);
auto [c, s] = solve(N, primes, inverse);
cout << c << ' ' << s << '\n';
}
return 0;
}