Pagini recente » Cod sursa (job #2253591) | Cod sursa (job #549030) | Cod sursa (job #1522848) | Cod sursa (job #2671780) | Cod sursa (job #916314)
Cod sursa(job #916314)
#include <fstream>
#include <algorithm>
#include <math.h>
#include <stdlib.h>
using namespace std;
const int dim = 1000030, mod = 9973;
long long N;
int T, NF, NR, SUM, ciur[dim];
ifstream fi ("ssnd.in");
ofstream fo ("ssnd.out");
inline int putere (int x, int p) {
int rez = 1;
x %= mod;
for(; p; p >>= 1) {
if(p & 1) {
rez *= x;
rez %= mod;
}
x *= x;
x %= mod;
}
return rez;
}
void calc_ciur ()
{
int i, j;
for (i = 2; i < dim; i++)
{
if (ciur[i]) continue;
ciur[++ciur[0]] = i;
for (j = i << 1; j < dim; j += i)
ciur[j] = 1;
}
}
void calc_nr_divizori (int n)
{
NR *= (n + 1);
}
void calc_suma_divizori (int p, int n)
{
int a = putere (p, n + 1) - 1;
if (a < 0) a += mod;
int b = putere (p - 1, mod - 2);
SUM = SUM * a % mod * b % mod;
}
void calc_factori_primi ()
{
int i, n;
long long x = N, d;
NF = -1;
for (i = 1; 1LL * ciur[i] * ciur[i] <= N; i++)
{
if (x % ciur[i]) continue;
d = ciur[i];
for (n = 0; x % d == 0; x /= d, n++);
calc_nr_divizori (n);
calc_suma_divizori (d % mod, n);
}
if (x != 1)
{
calc_nr_divizori (1);
calc_suma_divizori (x % mod, 1);
}
}
int main ()
{
calc_ciur ();
fi >> T;
while (T --)
{
fi >> N;
NR = SUM = 1;
calc_factori_primi ();
fo << NR << ' ' << SUM << '\n';
}
return 0;
}