Pagini recente » Cod sursa (job #651513) | Cod sursa (job #702626) | Cod sursa (job #612240) | Cod sursa (job #1227456) | Cod sursa (job #2576356)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
const long long MOD = 9973;
vector<int>primes;
bool c[1000005];
long long lgput(long long n, long long p)
{
long long sol = 1;
long long a = n;
for (long long i = 0; (1ll << i) <= p; i++)
{
if ((1ll << i) & p)
sol = (sol * a) % MOD;
a = (a * a) % MOD;
}
return sol;
}
long long imod(long long n)
{
return lgput(n, MOD - 2);
}
inline void precalcPrimes(int n)
{
c[0] = c[1] = 1;
for (int i = 4; i <= n; i += 2)
c[i] = 1;
primes.push_back(2);
int lim = (int)sqrt((double)n);
for (int i = 3; i <= lim; i += 2)
if (c[i] == 0) {
primes.push_back(i);
for (int j = i * i; j <= n; j += 2 * i)
c[j] = 1;
}
}
long long answer(long long p, long long d)
{
long long val1 = (lgput(p, d + 1)-1)%MOD;
long long val2 = imod((p - 1));
return (val1 * val2) % MOD;
}
pair<long long, long long> getInfo(long long n)
{
int e = 0, k = 0;
long long cnt = 1;
long long sum = 1;
bool prime = true;
while (1ll*primes[k]*primes[k] <= n && n > 1)
{
int d = primes[k];
if (n % d != 0)
{
k++;
continue;
}
e = 0;
while (n % d == 0)
{
e++;
n /= d;
}
if (e > 0)
{
prime = false;
cnt *= (1ll*e + 1);
sum = (sum * answer(1ll*d,1ll*e))%MOD;
}
k++;
}
if (n > 1) {
if (prime)
{
return (make_pair(2, (n + 1) % MOD));
}
else
{
cnt *= 2;
cnt %= MOD;
sum = (sum * answer(n, 1)) % MOD;
return make_pair(cnt, sum);
}
}
return make_pair(cnt, sum);
}
int main()
{
precalcPrimes(1000000);
int t;
long long n;
fin >> t;
while (t--)
{
fin >> n;
pair<int, long long>info = getInfo(n);
fout << info.first << " " << info.second << "\n";
}
return 0;
}