Pagini recente » Cod sursa (job #286413) | Cod sursa (job #446293) | Cod sursa (job #2190351) | Cod sursa (job #1626122) | Cod sursa (job #2500190)
#include <cstdio>
#include <bitset>
#include <vector>
using namespace std;
const int NMAX = 1005005;
const int MOD = 9973;
int tests;
bitset<NMAX> notPrime;
vector<int> primes;
long long N;
struct factorPart {
long long factor;
int exponent;
};
void precomputePrimes() {
for (int i = 2; i * i < NMAX; i++) {
if (!notPrime[i]) {
for (int j = i * i; j < NMAX; j += i) {
notPrime[j] = 1;
}
}
}
for (int i = 2; i < NMAX; i++) {
if (!notPrime[i]) {
primes.push_back(i);
}
}
}
vector<factorPart> decomposeNumber(long long number) {
vector<factorPart> result;
for (int j = 0; j < primes.size() && 1LL * primes[j] * primes[j] <= number; j++) {
if (number % primes[j] == 0) {
int exponent = 0;
while (number % primes[j] == 0) {
number /= primes[j];
exponent++;
}
result.push_back({primes[j], exponent});
}
}
if (number != 1) {
result.push_back({number, 1});
}
return result;
}
void printDivisorsInfo(vector<factorPart> decomposition) {
int totalSum = 1, totalDivisors = 1;
for (factorPart fctPart : decomposition) {
int factorPow = 1;
for (int exp = 1; exp <= fctPart.exponent + 1; exp++) {
factorPow = factorPow * fctPart.factor;
}
totalDivisors *= (fctPart.exponent + 1);
totalSum = (totalSum * (1LL * (factorPow - 1) / (fctPart.factor - 1)) % MOD) % MOD;
}
printf("%d %d\n", totalDivisors, totalSum);
}
int main() {
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
precomputePrimes();
scanf("%d", &tests);
for (int test_no = 0; test_no < tests; test_no++) {
scanf("%lld", &N);
vector<factorPart> decomposition = decomposeNumber(N);
printDivisorsInfo(decomposition);
}
return 0;
}