Pagini recente » Cod sursa (job #1886863) | Cod sursa (job #1193326) | Cod sursa (job #829489) | Cod sursa (job #2168670) | Cod sursa (job #1885960)
#include <cstdio>
#include <vector>
using namespace std;
const int MOD = 9973;
vector <int> prime;
bool c[1000005];
void ciur() {
prime.push_back(2);
int n = 1000000, radn = 1000;
for(int i = 3; i <= radn; i += 2)
if(!c[i])
for(int j = i * i; j <= n; j += 2 * i)
c[j] = 1;
for(int i = 3; i <= n; i += 2)
if(!c[i])
prime.push_back(i);
}
void gcd(int x, int y, int &a, int &b) {
if(y == 0) {
a = 1;
b = 0;
} else {
gcd(y, x % y, a, b);
int backup = a;
a = b;
b = backup - b * (x / y);
}
}
int poww(int a, int b) {
a = a % MOD;
int rasp = 1;
for( ; b; b >>= 1) {
if(b & 1) {
rasp *= a;
rasp %= MOD;
}
a = a * a;
a %= MOD;
}
return rasp;
}
void descompunere(long long n) {
int ind = 0, d, e, raspA = 1, raspB = 1, invers, y;
while(ind < prime.size() && (long long) prime[ind] * prime[ind] <= n && n > 1) {
d = prime[ind];
e = 0;
while(n % d == 0) {
n /= d;
++ e;
}
if(e > 0) {
raspA = ( raspA * (e + 1) ) % MOD;
gcd(d - 1, MOD, invers, y);
if(invers <= 0)
invers = MOD + invers % MOD;
raspB = ((raspB * (poww(d, e + 1) - 1) % MOD) * invers) % MOD;
}
++ ind;
}
if(n > 1) {
d = n;
e = 1;
raspA = ( raspA * (e + 1) ) % MOD;
gcd(d - 1, MOD, invers, y);
if(invers <= 0)
invers = MOD + invers % MOD;
raspB = ((raspB * (poww(d, e + 1) - 1) % MOD) * invers) % MOD;
}
printf("%d %d\n", raspA, raspB);
}
int main() {
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
ciur();
int t;
long long a;
scanf("%d", &t);
while(t--) {
scanf("%lld", &a);
descompunere(a);
}
return 0;
}