Pagini recente » Cod sursa (job #520911) | Cod sursa (job #2745223) | Cod sursa (job #1669167) | Cod sursa (job #2965688) | Cod sursa (job #2461283)
#include <fstream>
#include <cmath>
using namespace std;
const int maxCiur = 50000;
const int maxPrime = 5140;
bool ciur[maxCiur];
int prime[maxPrime];
ifstream cin("ssnd.in");
ofstream cout("ssnd.out");
//generam ciurul
void prelucrareCiur() {
ciur[0] = 1;
ciur[1] = 1;
int i;
for (i = 2; i <= sqrt(maxCiur); ++i)
if (!ciur[i])
for (int j = i; j * i < maxCiur; ++j)
ciur[i * j] = 1;
int k = 0;
for (int i = 0; i < maxCiur && k < maxPrime; ++i)
if (!ciur[i]) {
prime[k] = i;
++k;
}
}
//aflam nr de divizori si suma acestora
void divizori(unsigned long long n, int& rez, int& suma) {
int p;
for (int d = 0; prime[d] != 0 && n > 1; ++d) {
p = 0;
while (n % prime[d] == 0) {
++p;
n /= prime[d];
}
if (p) {
rez *= p + 1;
suma *= (pow(prime[d], p + 1) - 1) / (prime[d] - 1);
suma %= 9973;
}
}
//if (rez == 2)
//++suma;
if (n > 1){
suma += n;
rez++;
}
}
int main() {
prelucrareCiur();
int t;
unsigned long long n;
cin >> t;
for (int i = 0; i < t; ++i) {
cin >> n;
int suma = 1;
int rez = 1;
divizori(n, rez, suma);
//if (n == 13)
//++suma;
cout << rez << " " << suma << "\n";
}
return 0;
}