Pagini recente » Cod sursa (job #2282379) | Cod sursa (job #2662214) | Cod sursa (job #374133) | Cod sursa (job #269745) | Cod sursa (job #485037)
Cod sursa(job #485037)
// suma si nr. div. unui numar
# include <cstdio>
# include <math.h>
# include <algorithm>
using namespace std;
# define FIN "ssnd.in"
# define FOUT "ssnd.out"
const int MOD = 9973;
const int BND = 1000;
const int MAX_P = 80000;
const int MAX_S = 1000001;
int T, i, j, cnt, lim, d;
long long M, b, nrdiv, inv, sumdiv;
bool prim[MAX_S];
int nrprim[MAX_P];
int pow(int base, int N) {
int rez = 1, temp;
base %= MOD;
for (temp = 1; temp <= N; temp <<= 1, base = (base * base) % MOD)
if ((temp & N)) rez = (rez * base) % MOD;
return rez;
}
int main() {
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
memset(prim, true, sizeof(prim)); nrprim[cnt = 1] = 2;
for (i = 3; i < MAX_S; i += 2)
if (prim[i]) {
nrprim[++cnt] = i;
if (i <= BND) {
j = i * i;
for (; j < MAX_S; j += i) prim[j] = false;
}
}
nrprim[++cnt] = MAX_S;
scanf("%d", &T);
for (; T; --T) {
scanf("%lld", &M);
lim = (int) sqrt(M); nrdiv = 1; sumdiv = 1;
for (i = 1; nrprim[i] <= lim && M != 1; ++i)
if (!(M % nrprim[i])) {
d = 1; b = 1;
while (!(M % nrprim[i])) {
++d;
M /= nrprim[i];
b *= nrprim[i];
}
nrdiv *= d;
b = (b * nrprim[i] + MOD - 1) % MOD;
inv = pow(nrprim[i] - 1, MOD - 2);
sumdiv = (sumdiv * b * inv) % MOD;
}
if (M != 1) {
nrdiv <<= 1;
inv = pow(M - 1, MOD - 2);
M %= MOD; b = (M * M + MOD - 1) % MOD;
sumdiv = (sumdiv * b * inv) % MOD;
}
printf("%lld %lld\n", nrdiv, sumdiv);
}
return 0;
}