Pagini recente » Cod sursa (job #2671002) | Cod sursa (job #2937904) | Cod sursa (job #1473922) | Cod sursa (job #1440023) | Cod sursa (job #775555)
Cod sursa(job #775555)
#include <stdio.h>
const int mod = 9973;
int primes[78499];
char isnp[500009];
void sieve();
int power(int x, int p);
int main()
{
int i, t, p, nd, sd, aux1, aux2;
long long n;
FILE *in = fopen("ssnd.in", "r");
FILE *out = fopen("ssnd.out", "w");
sieve();
for (fscanf (in, "%d", &t); t; --t)
{
fscanf (in, "%lld", &n);
nd = 1; sd = 1;
for (i = 1; n > 1 && i < primes[0]; ++i)
{
for (p = 0; n % primes[i] == 0; ++p, n /= primes[i]) ;
if (p)
{
nd *= (p + 1);
aux1 = power(primes[i], p+1) - 1;
aux2 = power(primes[i]-1, mod-2);
sd *= (aux1 * aux2)%mod;
sd %= mod;
}
}
fprintf (out, "%d %d\n", nd, sd);
}
fclose(out);
return 0;
}
int power (int x, int p) {
int i, r;
x %= mod;
for (i = 1, r = 1; i <= p; i <<= 1)
{
if (i & p)
{
r *= x;
r %= mod;
}
x *= x;
x %= mod;
}
return r;
}
void sieve () {
int i, j;
primes[0] = 1;
primes[1] = 2;
for (i = 1; i <= 499; ++i)
if (!isnp[i])
{
primes[++primes[0]] = (i << 1) + 1;
for (j = (i*i + i) << 1; j <= 499999; j += (i << 1) + 1)
isnp[j] = 1;
}
for ( i = 500; i <= 499999; ++i)
if (!isnp[i]) primes[++primes[0]] = (i << 1) + 1;
}