Pagini recente » Cod sursa (job #3252129) | Cod sursa (job #370390) | Cod sursa (job #2152230) | Cod sursa (job #925495) | Cod sursa (job #2224718)
#include <fstream>
#include <vector>
#include <string>
using namespace std;
const string IN_FILE = "ssnd.in";
const string OUT_FILE = "ssnd.out";
const int MOD = 9973;
const int MAX_PRIME = 1000000;
struct Factor {
int64_t value, p;
int a;
};
vector<int> generatePrimes(const int n) {
auto isPrime = vector<bool>(n + 1, true);
auto primes = vector<int>({2});
for (int i = 3; i <= n; i += 2) {
if (!isPrime[i]) continue;
primes.push_back(i);
for (int j = int(min(1LL * i * i, 1LL * n + 1)); j <= n; j += i) {
isPrime[j] = false;
}
}
return primes;
}
vector<Factor> factorize(const vector<int>& primes, const int64_t n) {
auto factors = vector<Factor>();
int64_t x = n;
const int limit = int(primes.size());
for (int i = 0; i < limit && 1LL * primes[i] * primes[i] <= x; i++) {
const int p = primes[i];
if (x % p == 0) {
int64_t value = 1;
int a = 0;
for (; x % p == 0; x /= p, value *= p, a++);
factors.push_back({value, p, a});
}
}
if (x > 1) {
factors.push_back({x, x, 1});
}
return factors;
}
int countDivisors(const vector<Factor>& factors) {
int count = 1;
for (const auto& f : factors) {
count *= (f.a + 1);
}
return count;
}
int sumDivisors(const vector<Factor>& factors) {
int sum = 1;
for (const auto& f : factors) {
sum = (1LL * sum * ((1LL * f.value * f.p - 1) / (f.p - 1))) % MOD;
}
return sum;
}
int main() {
ifstream in(IN_FILE);
ofstream out(OUT_FILE);
const auto primes = generatePrimes(MAX_PRIME);
int t;
in >> t;
for (int i = 0; i < t; i++) {
int64_t n;
in >> n;
const auto factors = factorize(primes, n);
out << countDivisors(factors) << " " << sumDivisors(factors) << "\n";
}
in.close();
out.close();
return 0;
}