Pagini recente » Cod sursa (job #2141348) | Cod sursa (job #1574438) | Cod sursa (job #1574538) | Cod sursa (job #2134735) | Cod sursa (job #2099752)
#include <bits/stdc++.h>
#define nmax 1000050
#define P 9973
#define in "ssnd.in"
#define out "ssnd.out"
using namespace std;
ifstream fin(in);
ofstream fout(out);
bitset<nmax> t;
int n, prime[nmax];
void Ciur()
{
int i, j;
for (i = 3; i * i < nmax; i += 2)
if (t[i] == 0)
for (j = i * i; j < nmax; j = j + 2 * i)
t[j] = 1;
n = 1;
prime[1] = 2;
for (i = 3; i < nmax; i += 2)
if (t[i] == 0)
prime[++n] = i;
}
/// a^n % P
int PLog(int a, int n)
{
int p = 1;
while (n > 0)
{
if (n % 2 == 1)
{
p = (1LL * p * a) % P;
n--;
}
n /= 2;
a = (1LL * a * a) % P;
}
return p;
}
/// determina suma si numarul divizorilor lui x
void SumDiv(long long x)
{
int i, d, nrDiv, sumaDiv, e, X1, X2;
if (n == 1)
{
fout << "1 1\n";
return;
}
d = 2;
nrDiv = 1;
sumaDiv = 1;
for (i = 1; x > 1 && 1LL * d * d <= x; i++)
{
/// determin numarul de divizori si suma divizorilor lui x
if (x % d == 0)
{
e = 1;
while (x % d == 0)
{
e++;
x /= d;
}
nrDiv *= e;
X1 = PLog(d, e) - 1;
if (X1 < 0) X1 += P;
X2 = PLog(d - 1, P - 2);
sumaDiv = (((sumaDiv * X1) % P) * X2) % P;
}
d = prime[i + 1];
}
if (x > 1)
{
nrDiv *= 2;
sumaDiv = (1LL * sumaDiv * (x + 1) % P);
}
fout << nrDiv << " " << sumaDiv << "\n";
}
void CitireAfisare()
{
int T;
long long W;
fin >> T;
while (T > 0)
{
T--;
fin >> W;
SumDiv(W);
}
fin.close();
fout.close();
}
int main()
{
Ciur();
CitireAfisare();
return 0;
}