Pagini recente » Cod sursa (job #1941002) | Cod sursa (job #545910) | Cod sursa (job #1625922) | Cod sursa (job #2628572) | Cod sursa (job #1480111)
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
const int NMAX = 1000505;
const int MOD = 9973;
struct primeFactorInfo {
ll p;
int exp;
};
int tests, r, invMod[MOD], E[MOD];
ll n, P[NMAX];
bool notPrime[NMAX];
struct solution {
ll noDivs, sumDivs;
};
int lgput(int base, int exp, int mod) {
int res = 1;
while (exp) {
if (exp & 1) {
res = (res * base) % mod;
}
base = (base * base) % mod;
exp >>= 1;
}
return res;
}
int gcd(int x, int y) {
return !y ? x : gcd(y, x % y);
}
void prepare() {
for (int i = 2; i * i < NMAX; i++)
if (!notPrime[i]) {
for (int j = i * i; j < NMAX; j += i)
notPrime[j] = 1;
}
for (int i = 2; i < NMAX; i++)
if (!notPrime[i])
P[++r] = i;
E[0] = 1;
for (int i = 1; i < MOD; i++)
E[i] = (E[i - 1] * 11) % MOD;
for (int i = 0; i < MOD; i++) {
invMod[E[i]] = E[MOD - 1 - i];
}
}
vector<primeFactorInfo> decompose(ll n) {
vector<primeFactorInfo> sol;
for (int i = 1; 1LL * P[i] * P[i] <= n; i++)
if (n % P[i] == 0) {
int exp = 0;
while (n % P[i] == 0) {
n /= P[i];
exp++;
}
sol.push_back({P[i] % MOD, exp});
}
if (n != 1) {
sol.push_back({n % MOD, 1});
}
return sol;
}
solution computeSol(vector<primeFactorInfo>& divs) {
if (divs.size() == 0) {
return {1, 1};
}
int res = 1;
ll noDivs = 1;
for (auto& div: divs) {
ll denom = lgput(div.p, div.exp + 1, MOD) - 1;
if (denom < 0) denom += MOD;
ll nom = div.p - 1;
if (nom < 0) nom += MOD;
res = (res * (denom * invMod[nom]) % MOD) % MOD;
noDivs *= (div.exp + 1);
}
return {noDivs, res};
}
void solve() {
scanf("%d", &tests);
while (tests--) {
scanf("%lld", &n);
vector<primeFactorInfo> divs = decompose(n);
solution sol = computeSol(divs);
printf("%lld %lld\n", sol.noDivs, sol.sumDivs);
}
}
int main() {
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
prepare();
solve();
return 0;
}