Pagini recente » Rating Popescu Vasile (VasPopescu) | Cod sursa (job #1604974) | Monitorul de evaluare | Profil lazar_elena_ingrid | Cod sursa (job #1900894)
#include <cstdio>
#include <iostream>
#include <string.h>
#include <cmath>
using namespace std;
#define MOD 9973
int prime[78498] = {2};
int divisor[4000];
char power[4000];
void Eratosthenes(int);
int Factorize(long long);
void ModularInverse(int, int, int&, int&);
int Exponentiate(int, int);
int main(){
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
int T; scanf("%d", &T);
Eratosthenes(999983);
while(T--){
long long N; scanf("%lld", &N);
int sumOfDivisors = 1, numberOfDivisors = 1;
if(N == 1){
printf("1 1\n");
continue;
}
int index = Factorize(N);
for(int i = 0; i <= index; i++){
numberOfDivisors *= (power[i] + 1);
numberOfDivisors %= MOD;
}
for(int i = 0; i <= index; i++){
int numerator, denominator, x, y;
numerator = Exponentiate(divisor[i], power[i] + 1);
numerator = (numerator + MOD - 1) % MOD;
denominator = divisor[i] - 1;
ModularInverse(denominator, MOD, x, y);
if(x <= 0) x = MOD + x % MOD;
denominator = x;
sumOfDivisors *= (numerator * denominator) % MOD;
sumOfDivisors %= MOD;
}
printf("%d %d\n", numberOfDivisors, sumOfDivisors);
}
return 0;
}
void Eratosthenes(int N){
int i, j, p = 0;
char list[62501]; memset(list, 0, 62501);
for(i = 1; ((i * i) << 1) + (i << 1) <= N; i += 1){
if((list[i >> 3] & (1 << (i & 7))) == 0){
for(j = ((i * i) << 1) + (i << 1); (j << 1) + 1 <= N; j += (i << 1) + 1){
list[j >> 3] |= (1 << (j & 7));
}
}
}
for (i = 1; 2 * i + 1 <= N; ++i){
if((list[i >> 3] & (1 << (i & 7))) == 0){
prime[++p] = 2 * i + 1;
}
}
}
int Factorize(long long N){
int sqrtN = (int)sqrt(N);
int index = -1;
for(int p = 0; prime[p] <= sqrtN; p++){
if(N % prime[p] == 0){
divisor[++index] = prime[p];
power[index] = 1;
N /= prime[p];
while(N % prime[p] == 0){
power[index]++;
N /= prime[p];
}
}
}
if(N > 1){
divisor[++index] = N;
power[index] = 1;
}
return index;
}
void ModularInverse(int a, int b, int &x, int &y){
if(!b){
x = 1;
y = 0;
}else{
int x0, y0;
ModularInverse(b, a % b, x0, y0);
x = y0;
y = x0 - (a / b) * y0;
}
}
int Exponentiate(int a, int b){
int result = 1;
while(b){
if(b&1) result = (result * a) % MOD;
b >>= 1;
a = (a * a) % MOD;
}
return result;
}