Pagini recente » Istoria paginii utilizator/dianaionica | Rating Precup Vlad (vladprecup) | Profil M@2Te4i | Statistici Todica Alexandru (alexandru_todica) | Cod sursa (job #1001069)
#include <fstream>
#include <vector>
using namespace std;
const int mod = 9973;
int n;
long long x, s, nd;
vector <bool> ciur (1e6+5);
vector <int> prim;
long long POW (long long a, long long b) {
long long sol = 1, tmp = a % mod;
for (long long i = 1; i <= b; i <<= 1) {
if (b & i)
sol = (sol * tmp) % mod;
tmp = (tmp * tmp) % mod;
}
return sol;
}
void PreGen() {
prim.push_back (2);
for (int i = 4; i < 1e6+5; i += 2)
ciur[i] = 1;
int i = 3;
for (; i < (1e6+5) / 2; i += 2)
if (!ciur[i]) {
for (int j = i * 2; j < 1e6 + 5; j += i)
ciur[j] = 1;
prim.push_back (i);
}
for (; i < 1e6 + 5; i += 2)
if (!ciur[i])
prim.push_back (i);
}
int main() {
PreGen();
ifstream fin ("ssnd.in");
fin >> n;
vector <pair <long long, long long> > D;
ofstream fout ("ssnd.out");
while (n--) {
vector <pair <long long, long long> > ().swap (D);
fin >> x;
long long aux = x;
for (vector <int> :: iterator it = prim.begin(); *it <= x && it != prim.end() && x != 1; ++it) {
if (x % *it == 0) {
D.push_back (make_pair (*it, 0));
while (x % *it == 0) {
D.back().second++;
x /= *it;
}
}
if (x < 1e6 + 5 && !ciur[x])
break;
}
if (D.empty())
D.push_back (make_pair (aux, 1));
else
if (x > 1)
D.push_back (make_pair (x, 1));
nd = s = 1;
for (vector <pair <long long, long long> > :: iterator it = D.begin(); it != D.end(); ++it) {
nd *= (*it).second + 1;
s = (s * (POW ((*it).first, (*it).second + 1) - 1)) % mod;
s = (s * POW ((*it).first - 1, mod - 2)) % mod;
}
if (s < 0)
s += mod;
fout << nd << " " << s << "\n";
}
fcloseall();
}