Pagini recente » Cod sursa (job #3337610) | Cod sursa (job #3356484) | Cod sursa (job #3340579) | Cod sursa (job #190330) | Cod sursa (job #3317669)
#include <bits/stdc++.h>
using namespace std;
const int MOD = 9973;
const int NMAX = 1000000;
const bool PRIM = 0;
const bool COMPUS = 1;
bool Sieve[NMAX + 10];
vector<int> primes;
void ComputeSieve() {
Sieve[0] = Sieve[1] = COMPUS;
for (int i = 2; i * i <= NMAX; i++) {
if (Sieve[i] == PRIM) {
for (int j = i * i; j <= NMAX; j += i)
Sieve[j] = COMPUS;
}
}
for (int i = 2; i <= NMAX; i++)
if (Sieve[i] == PRIM)
primes.push_back(i);
}
unsigned long long RidicareLaPutereULL(unsigned long long baza, unsigned int exp) {
unsigned long long rez = 1;
while (exp) {
if (exp & 1) rez *= baza;
baza *= baza;
exp >>= 1;
}
return rez;
}
pair<unsigned long long, unsigned long long> nrsumdiv(unsigned long long n) {
unsigned long long nrdiv = 1, sumdiv = 1;
for (int i = 0; i < (int)primes.size() && 1ULL * primes[i] * primes[i] <= n; i++) {
unsigned long long d = primes[i];
unsigned int putere = 0;
while (n % d == 0) {
putere++;
n /= d;
}
if (putere > 0) {
// Compute sum for this prime power exactly (no mod)
unsigned long long num = RidicareLaPutereULL(d, putere + 1) - 1;
unsigned long long den = d - 1;
unsigned long long part = num / den;
sumdiv *= part;
nrdiv *= (putere + 1);
}
}
if (n > 1) {
unsigned long long num = (n * n) - 1;
unsigned long long den = n - 1;
unsigned long long part = num / den;
sumdiv *= part;
nrdiv *= 2;
}
return {nrdiv % MOD, sumdiv % MOD};
}
int main() {
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
int t;
unsigned long long n;
scanf("%d", &t);
ComputeSieve();
while (t--) {
scanf("%llu", &n);
auto [nrdiv, sumdiv] = nrsumdiv(n);
printf("%llu %llu\n", nrdiv, sumdiv);
}
return 0;
}