Pagini recente » Cod sursa (job #1781553) | Cod sursa (job #2209277) | Cod sursa (job #233525) | Cod sursa (job #1790433) | Cod sursa (job #764768)
Cod sursa(job #764768)
/*
Suma si numarul de divizori.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAXN 1000000
#define MOD 9973
int t;
int factor_prim[MAXN];
bool prim[MAXN];
void ciur_eratostene () {
int i, j;
int k = 0;
for (i = 2; i < MAXN; i++)
prim[i] = 0;
for (i = 2; i < MAXN; i++) {
if (!prim[i])
factor_prim[++k] = i;
for (j = i + i; j < MAXN; j += i)
prim[j] = 1;
}
}
void sum_div (long long n) {
long long sum_div = 1, nr_div = 1;
long long d, p;
int i = 1;
while ((factor_prim[i] * factor_prim[i] <= n) && (n > 1)) {
if (!(n % factor_prim[i])) {
p = factor_prim[i];
d = 0;
while (!(n % factor_prim[i])) {
d++;
p *= factor_prim[i];
n /= factor_prim[i];
}
nr_div *= (d + 1);
sum_div = (sum_div * (p - 1) / (factor_prim[i] - 1)) % MOD;
}
i++;
}
if (n > 1) {
nr_div *= 2;
sum_div = (sum_div * (n * n - 1) / (n - 1)) % MOD;
}
printf("%lld %lld\n", nr_div, sum_div);
}
int main () {
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
long long n;
int i;
scanf("%d", &t);
ciur_eratostene();
for (i = 0; i < t; i++) {
scanf("%lld", &n);
sum_div(n);
}
return 0;
}