Pagini recente » biconexe | Cod sursa (job #2018040) | Cod sursa (job #1572456) | Cod sursa (job #147569) | Cod sursa (job #485046)
Cod sursa(job #485046)
// 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, pM;
bool prim[MAX_S];
int nrprim[MAX_P];
int pow(int base, int N) {
int rez = 1, temp;
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; inv = 1;
for (i = 1; nrprim[i] <= lim && M != 1; ++i)
if (!(M % nrprim[i])) {
pM = M;
for (d = 1; !(M % nrprim[i]); ++d, M /= nrprim[i]);
nrdiv *= d;
inv = ((nrprim[i] - 1) * inv) % MOD;
sumdiv = (sumdiv * ((pM / M) * nrprim[i] + MOD - 1)) % MOD;
}
if (M != 1) {
nrdiv <<= 1;
inv = (inv * (M - 1)) % MOD;
M %= MOD;
sumdiv = (sumdiv * (M * M + MOD - 1)) % MOD;
}
printf("%lld %lld\n", nrdiv, (sumdiv * pow(inv, MOD - 2)) % MOD);
}
return 0;
}