Pagini recente » Cod sursa (job #1810384) | Cod sursa (job #2341027) | Cod sursa (job #1636855) | Cod sursa (job #2465674) | Cod sursa (job #1953602)
#include <bits/stdc++.h>
#define MAXN 1000001
using namespace std;
const int MOD = 9973;
int primes[MAXN], K;
bool sieve[MAXN];
void sieveOfErathostenes() {
int prime = 2;
while(prime * prime < MAXN) {
for(int i = prime; i*prime < MAXN; ++i)
sieve[i * prime] = 1;
prime++;
while(sieve[prime])
prime++;
}
for(int i=2; i<MAXN; ++i)
if(!sieve[i])
primes[K++] = i;
}
long long raiseToPower(long long f, int exp) {
long long ans = 1;
while(exp) {
if(!(exp&1)) {
exp /= 2;
f = (f * f) % MOD;
}else {
exp--;
ans = (ans * f) % MOD;
}
}
return ans;
}
inline void primeFactors(int number, long long ÷rs, long long &sum) {
int power = 0;
long long upper, lower;
for(int i=0; i<K && primes[i] * primes[i] <= number; ++i) {
if(number % primes[i] == 0) {
power = 0;
while(number % primes[i] == 0) {
power++;
number /= primes[i];
}
dividers = dividers * (power + 1);
upper = (raiseToPower(primes[i], power + 1) - 1) % MOD;
lower = raiseToPower(primes[i] - 1, MOD - 2) % MOD;
sum = (((sum * upper) % MOD) * lower) % MOD;
}
}
if(number > 1) {
dividers *= 2;
sum = (sum * (number+1)) % MOD;
}
}
int main()
{
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
int n, t;
long long dividers, sum;
sieveOfErathostenes();
scanf("%d", &t);
while(t -- ) {
scanf("%d", &n);
dividers = sum = 1;
primeFactors(n, dividers, sum);
printf("%lld %lld\n", dividers, sum);
}
return 0;
}