#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int NMAX = 1000005;
const long long MOD = 9973;
bool ciur[NMAX + 10];
vector <long long> prime;
struct Chestie {
long long fact, exp;
};
Chestie a[NMAX];
struct Curent {
long long fact, prod;
};
queue <Curent> q;
int main() {
int T;
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
scanf("%d", &T);
ciur[0] = ciur[1] = 1;
for(int j = 4; j <= NMAX; j += 2) {
ciur[j] = 1;
}
for(long long i = 3; i <= NMAX; i += 2) {
if(ciur[i] == 0) {
for(long long j = i * i; j <= NMAX; j += (2 * i)) {
ciur[j] = 1;
}
}
}
for(int i = 2; i <= NMAX; i++) {
if(ciur[i] == 0) {
prime.push_back(i);
}
}
while(T > 0) {
T--;
long long n;
scanf("%lld", &n);
int top = 0;
for(int i = 0; prime[i] * prime[i] <= n; i++) {
Chestie nr = {0, 0};
nr.fact = prime[i];
while(n % prime[i] == 0) {
n /= prime[i];
nr.exp++;
}
if(nr.exp > 0) {
a[++top] = nr;
}
}
if(n > 1) {
a[++top] = {n, 1};
}
q.push({1, 1});
long long nrfact = 1;
for(int i = 1; i <= top; i++) {
nrfact *= (a[i].exp + 1);
auto p = q.front();
p.prod %= MOD;
while(p.fact == i) {
q.pop();
long long inm = 1;
for(int j = 0; j <= a[i].exp; j++) {
q.push({p.fact + 1, inm * p.prod});
inm = (inm * a[i].fact) % MOD;
}
p = q.front();
}
}
printf("%lld ", nrfact);
long long sol = 0;
while(!q.empty()) {
auto nr = q.front();
sol = (sol + nr.prod) % MOD;
q.pop();
}
printf("%lld\n", sol);
}
return 0;
}