Nu aveti permisiuni pentru a descarca fisierul grader_test4.in
Cod sursa(job #485068)
Utilizator | Data | 16 septembrie 2010 22:26:10 | |
---|---|---|---|
Problema | Suma si numarul divizorilor | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2 kb |
// suma si nr. div. unui numar
# include <cstdio>
# include <bitset>
# include <vector>
# include <algorithm>
using namespace std;
# define FIN "ssnd.in"
# define FOUT "ssnd.out"
const int MOD = 9973;
const int BND = 1000;
const int MAX_S = 1000001;
long long M, pM;
bitset <MAX_S> prim;
vector <int> nrprim;
int T, i, j, lim, d, nrdiv, inv, sumdiv;
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);
nrprim.push_back(2);
for (i = 3; i <= BND; i += 2)
if (!prim[i]) {
nrprim.push_back(i);
j = i * i;
for (; j < MAX_S; j += i) prim[j] = 1;
}
for (i = BND + 1; i < MAX_S; i += 2)
if (!prim[i]) nrprim.push_back(i);
scanf("%d", &T);
for (; T; --T) {
scanf("%lld", &M);
nrdiv = 1; sumdiv = 1; inv = 1;
for (vector <int> :: iterator it = nrprim.begin(); it != nrprim.end() && *it * *it <= M && M > 1; ++it)
if (!(M % *it)) {
pM = M;
for (d = 1; !(M % *it); ++d, M /= *it);
nrdiv *= d;
inv = ((*it - 1) * inv) % MOD;
sumdiv = (sumdiv * ((pM / M) % MOD * *it + MOD - 1) % MOD) % MOD;
}
if (M != 1) {
nrdiv <<= 1;
inv = (inv * (M + MOD - 1) % MOD) % MOD;
M %= MOD;
sumdiv = (sumdiv * (M * M + MOD - 1) % MOD ) % MOD;
}
printf("%d %d\n", nrdiv, (sumdiv * pow(inv, MOD - 2)) % MOD);
}
return 0;
}