Pagini recente » Cod sursa (job #804039) | Cod sursa (job #2525612) | Cod sursa (job #552803) | Cod sursa (job #2496033) | Cod sursa (job #1238141)
#include <cstdio>
#include <bitset>
#define ll long long
#define NMAX 1000005
#define MOD 9973
using namespace std;
int n, A[NMAX], r;
ll x, noExp, sumExp;
bitset <NMAX> mark;
int lgput(int base, int exp)
{
int res = 1;
while (exp)
{
if (exp & 1)
res = ((ll)res * base) % MOD;
base = ((ll)base * base) % MOD;
exp >>= 1;
}
return res;
}
inline int invMod(int x)
{
return lgput(x, MOD - 2);
}
inline ll getSumDiv(ll x, int exp)
{
x %= MOD;
int num = 1;
for (int i = 1; i <= exp + 1; i++)
num = (num * x) % MOD;
num = (num - 1 + MOD) % MOD;
int denum = (x - 1 + MOD) % MOD;
return ((ll)num * invMod(denum)) % MOD;
}
int main()
{
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
for (int i = 2; i * i < NMAX; i++)
if (!mark[i])
for (int j = i * i; j < NMAX; j += i)
mark[j] = 1;
for (int i = 2; i < NMAX; i++)
if (!mark[i])
A[++r] = i;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%lld", &x);
noExp = 1; sumExp = 1;
for (int j = 1; (ll)A[j] * A[j] <= x; j++)
if (x % A[j] == 0)
{
int exp = 0;
while (x % A[j] == 0)
{
x /= A[j];
exp++;
}
noExp *= (exp + 1);
sumExp *= getSumDiv(A[j], exp);
}
if (x != 1)
{
noExp *= 2;
sumExp *= getSumDiv(x, 1);
}
printf("%lld %lld\n", noExp, sumExp);
}
return 0;
}