Pagini recente » Cod sursa (job #2744670) | Cod sursa (job #2290406) | Cod sursa (job #2374220) | Cod sursa (job #1941855) | Cod sursa (job #1598934)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
const int MOD = 9973;
const int MAXVAL = 1000000;
int n;
vector<int> v;
bool check[MAXVAL];
int put(int x, int a) {
//X ^ a
int v[32];
int res = 1;
v[1] = x % MOD;
for(int i = 2; i <= 31; ++i)
v[i] = (1ll * v[i - 1] * v[i - 1]) % MOD;
for(int i = 0 ; i <= a; ++i)
if(a & (1 << i))
res = (1ll * res * v[i + 1]) % MOD;
return res;
}
void eratostene() {
/* O(n * logn) */
for(int i = 2; i <= MAXVAL; ++i)
if(check[i] == 0) {
v.push_back(i);
for(int j = i + i; j <= MAXVAL; j += i)
check[j] = 1;
}
}
void find(long long x) {
int sumdiv = 1;
int nrdiv = 1;
for(unsigned i = 0 ; i < v.size(); ++i) {
int d = v[i];
if(1ll * d * d > x) break;
if(x % d) continue;
int nrd = 0;
int sirSum = 1;
int divPow = 1;
while(x % d == 0) {
divPow = (1ll * divPow * d) % MOD;
sirSum = (1ll * sirSum + divPow) % MOD;
x /= d;
nrd++;
}
nrdiv = (1ll * nrdiv * (nrd + 1)) % MOD;
sumdiv = (1ll * sumdiv * sirSum) % MOD;
}
if(x > 1) {
/*
* poate sa ramana maxim un divizor neluat in calcul
* si anume cel mai mare, ca un divizor sa nu fie luat in calcul trebuie ca
* el sa fie mai mare decat produsul tutoro celoralati divizori(d^2 > x)
* nu poate fi adevarat decat pentru cel mai mare divizor prim
*/
nrdiv = (1ll * nrdiv * 2) % MOD;
sumdiv = (1ll * sumdiv * (1 + x)) % MOD;
}
fout << nrdiv << " " << sumdiv << '\n';
}
int main() {
fin >> n;
eratostene();
while(n--) {
long long x;
fin >> x;
find(x);
}
return 0;
}