Pagini recente » Cod sursa (job #1042467) | Cod sursa (job #2911416) | Cod sursa (job #1384621) | Cod sursa (job #2954677) | Cod sursa (job #2771900)
#include <fstream>
#include <vector>
using namespace std;
const int MODULO = 9973;
const int NMAX = 1000000;
bool ciur[1 + NMAX];
vector<int> nrPrime;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
void initCiur()
{
ciur[0] = true;
ciur[1] = true;
nrPrime.push_back(2);
for (int i = 4; i <= NMAX; i += 2)
ciur[i] = true;
for (int i = 3; i <= NMAX; i += 2)
{
if (!ciur[i])
{
nrPrime.push_back(i);
for (long long j = 1ll * i * i; j <= NMAX; j += i)
ciur[j] = true;
}
}
}
int main()
{
initCiur();
int t;
in >> t;
while (t--)
{
int n;
in >> n;
int index = 0;
int suma = 1;
int numar = 1;
while (n > 1 && 1ll * nrPrime[index] * nrPrime[index] <= n)
{
int exp = 0;
long long putere = 1;
while (n % nrPrime[index] == 0)
{
n /= nrPrime[index];
exp++;
putere = putere * nrPrime[index];
}
if (exp > 0)
{
putere = putere * nrPrime[index] - 1;
numar *= (exp + 1);
suma = (suma * putere / (nrPrime[index] - 1)) % MODULO;
}
index++;
}
if (n > 1)
{
numar *= 2;
suma = (suma * (n + 1)) % MODULO;
/// aici sus vine (n^2 - 1) / (n - 1), pentru ca n e ultimul numar prim cautat acum. Dar fractia aia este egala cu (n - 1)(n + 1) / (n - 1) = n + 1
}
out << numar << ' ' << suma << '\n';
}
return 0;
}