Pagini recente » Cod sursa (job #762202) | Cod sursa (job #1831722) | Rating Tasi Balazs (balazstasi) | Cod sursa (job #2715374) | Cod sursa (job #687114)
Cod sursa(job #687114)
#include <cstdio>
#include <vector>
#include <bitset>
#include <cstring>
using namespace std;
#define MOD 9973
#define MAX 1000000
#define ll long long
int P[MAX], E[MAX], T, K, X;
ll N;
vector <int> V;
bitset <MAX> B;
int s_div (ll), pow (int, int);
void ciur (), descompunere (ll);
int main () {
freopen ("ssnd.in", "r", stdin);
freopen ("ssnd.out", "w", stdout);
ciur ();
scanf ("%d", &T);
for ( ; T; T--) {
scanf ("%lld", &N);
descompunere (N);
printf ("%d %d\n", X, s_div (N));
}
return 0;
}
int pow (int a, int exp) {
int sol = 1; int p = a;
for ( ; exp; exp >>= 1) {
if (exp & 1)
sol = (sol * p) % MOD;
p = (p * p) % MOD;
}
return sol;
}
int s_div (ll N) {
int S = 1;
for (vector <int>::iterator it = V.begin (); it != V.end (); it++) {
int Y = pow (P[*it], E[*it] + 1) - 1;
if (Y < 0) Y += MOD;
S = (S * Y) % MOD;
Y = pow (P[*it] - 1, MOD - 2);
S = (S * Y) % MOD;
}
return S;
}
void ciur () {
int i, j;
for (i = 2; i <= MAX; i++)
if (!B[i]) {
P[++K] = i;
for (j = 2 * i; j <= MAX; j += i)
B[j] = 1;
}
}
void descompunere (ll N) {
memset (E, 0, sizeof (E)); V.clear ();
ll M = N; int i; X = 1;
for (i = 1; i <= K && (ll) P[i] * (ll) P[i] <= N; i++) {
while (M % (ll) P[i] == 0) {
if (!E[i]) V.push_back (i);
E[i]++;
M /= (ll) P[i];
}
if (E[i]) X = (X * (E[i] + 1)) % MOD;
}
if (M > 1) {
for ( ; i <= K; i++)
if ((ll) P[i] == M) break;
E[i]++; V.push_back (i);
X = (X * (E[i] + 1)) % MOD;
}
}