Pagini recente » Cod sursa (job #1114539) | Cod sursa (job #2003817) | Rating Brasoveanu Mircea (denmircea) | Cod sursa (job #3282496) | Cod sursa (job #481609)
Cod sursa(job #481609)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <cassert>
#include <algorithm>
using namespace std;
const char iname[] = "ssnd.in";
const char oname[] = "ssnd.out";
const int MAX_SQRTN = 1000005;
typedef long long i64;
bitset<MAX_SQRTN> non_prime;
vector <int> primes;
int get_to_power(int d, int p) {
i64 ans = 1;
for (int i = 30; i >= 0; -- i)
ans = ((p >> i) & 1) ? (ans * ans * d) % 9973 : (ans * ans) % 9973;
return (int) ans;
}
int main(void) {
for (int i = 2; i <= MAX_SQRTN / 2; ++ i) if (!non_prime[i]) {
for (int j = i + i; j <= MAX_SQRTN; j += i)
non_prime[j] = true;
}
for (int i = 2; i <= MAX_SQRTN; ++ i) if (!non_prime[i])
primes.push_back(i);
ifstream in(iname);
ofstream out(oname);
int t;
assert(in >> t);
assert(1 <= t && t <= 1000);
while (t --) {
i64 n, m;
assert(in >> n);
assert(1 <= n && n <= 1000000000000LL);
i64 d_cnt = 1, d_sum = 1;
for (int i = 0; i < (int) primes.size() && (i64) primes[i] * primes[i] <= n; ++ i) {
if (n % primes[i]) continue ;
int d = 0;
while (n % primes[i] == 0)
++ d, n /= primes[i];
d_cnt = (d_cnt * (d + 1)) % 9973;
int a = (get_to_power(primes[i], d + 1) - 1) % 9973;
if (a < 0) a += 9973;
int b = (get_to_power(primes[i] - 1, 9971)) % 9973;
if (b < 0) b += 9973;
d_sum = (((d_sum * a) % 9973) * b) % 9973;
}
if (n > 1) {
d_cnt = (d_cnt * 2) % 9973;
int a = (get_to_power(n, 2) - 1) % 9973;
if (a < 0) a += 9973;
int b = (get_to_power(n - 1, 9971)) % 9973;
if (b < 0) b += 9973;
d_sum = (((d_sum * a) % 9973) * b) % 9973;
}
out << d_cnt << " " << d_sum << "\n";
}
in.close();
out.close();
return 0;
}