Pagini recente » Cod sursa (job #3145539) | Cod sursa (job #325367) | Cod sursa (job #2385265) | Cod sursa (job #2180017) | Cod sursa (job #1167179)
#include <fstream>
#include <vector>
using namespace std;
typedef long long int64;
const int MOD = 9973;
const int MAX_PRIME = 1000000;
vector<int> Primes;
void Eratosthenes() {
vector<bool> composite = vector<bool>(MAX_PRIME + 1, false);
for (int i = 2; i <= MAX_PRIME; ++i) {
if (!composite[i]) {
Primes.push_back(i);
for (int j = min(1LL * MAX_PRIME + 1, 1LL * i * i); j <= MAX_PRIME; j += i)
composite[j] = true;
}
}
}
inline int Power(int value, int power) {
int result = 1;
for (; power > 0; power >>= 1, value = (value * value) % MOD)
if (power & 1)
result = (result * value) % MOD;
return result;
}
inline int Inverse(const int value) {
return Power(value, MOD - 2);
}
inline vector< pair<int64, int> > GetFactorization(int64 value) {
vector< pair<int64, int> > factors;
for (int i = 0; i < int(Primes.size()) && 1LL * Primes[i] * Primes[i] <= value; ++i) {
int e = 0;
for (; value % Primes[i] == 0; value /= Primes[i], ++e);
if (e > 0)
factors.push_back(make_pair(Primes[i], e));
}
if (value > 1)
factors.push_back(make_pair(value, 1));
return factors;
}
int main() {
Eratosthenes();
ifstream cin("ssnd.in");
ofstream cout("ssnd.out");
int testCount;
cin >> testCount;
for (; testCount > 0; --testCount) {
int64 value;
cin >> value;
vector< pair<int64, int> > factors = GetFactorization(value);
int divisorCount = 1, divisorSum = 1;
for (int i = 0; i < int(factors.size()); ++i) {
divisorCount *= (factors[i].second + 1);
divisorSum = (divisorSum * ((Power(factors[i].first % MOD, factors[i].second + 1) + MOD - 1) * Inverse((factors[i].first - 1) % MOD) % MOD)) % MOD;
}
cout << divisorCount << " " << divisorSum << "\n";
}
cin.close();
cout.close();
return 0;
}