Pagini recente » Cod sursa (job #959217) | Cod sursa (job #353095) | Cod sursa (job #2464019) | Cod sursa (job #2655975) | Cod sursa (job #2484102)
// Divizorii unui număr natural n reprezintă mulţimea de numere naturale,
// mai mici sau egale cu n, cu proprietatea că divid pe n. Să se determine
// pentru t numere naturale cardinalul acestei mulţimi şi restul împărţirii
// sumei elementelor mulţimii la 9973.
#include <fstream>
using namespace std;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");
const int MAX = 1000000;
int t, nrPrime;
bool ciur[MAX];
int prime[MAX];
void eratostene() {
int i, j;
ciur[0] = ciur[1] = true;
for (i = 2; i * i <= MAX; i++)
if (ciur[i] == false)
for (j = 2; j <= MAX / i; j++)
ciur[i * j] = true;
for (i = 2; i <= MAX; i++)
if (ciur[i] == false)
prime[++nrPrime] = i;
}
void rezolva(int n) {
int i = 1, d = prime[i], p;
unsigned long long nrDiv = 1, sumDiv = 1, dLaPutereaP = 1;
while ((d * d <= n) && (i <= nrPrime)) {
p = 0;
dLaPutereaP = 1;
while (n % d == 0) {
p++;
n /= d;
dLaPutereaP *= d;
}
nrDiv *= (p + 1);
sumDiv *= (dLaPutereaP * d - 1)/(d - 1);
d = prime[++i];
}
if (n != 1) {
nrDiv *= 2;
sumDiv *= (1 + n);
}
fout << nrDiv << ' ' << sumDiv << '\n';
}
int main() {
int i, a;
eratostene();
fin >> t;
for (i = 1; i <= t; i++) {
fin >> a;
rezolva(a);
}
fin.close();
fout.close();
return 0;
}