Pagini recente » Cod sursa (job #2221906) | Cod sursa (job #2447873) | Cod sursa (job #55997) | Cod sursa (job #652059) | Cod sursa (job #2484161)
// 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, mod = 9973;
int t, nrPrime;
bool ciur[MAX + 1];
int prime[MAX + 1];
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(long long n) {
int i, d, p;
long long nrDiv = 1, sumDiv = 1, dLaPutereaP, sumDivFactor;
for (i = 1; i <= nrPrime && d * d <= n; i++) {
d = prime[i];
if (n % d != 0)
continue;
p = 0;
dLaPutereaP = 1;
sumDivFactor = 1;
while (n % d == 0) {
p++;
n /= d;
dLaPutereaP = (dLaPutereaP * d) % mod;
sumDivFactor = sumDivFactor + dLaPutereaP;
}
nrDiv = (nrDiv * (p + 1)) % mod;
sumDiv = (sumDiv * sumDivFactor) % mod;
}
if (n != 1) {
nrDiv = (nrDiv * 2) % mod;
sumDiv = (sumDiv * (1 + n)) % mod;
}
fout << nrDiv << ' ' << sumDiv << '\n';
}
int main() {
int i;
long long a;
eratostene();
fin >> t;
for (i = 1; i <= t; i++) {
fin >> a;
rezolva(a);
}
fin.close();
fout.close();
return 0;
}