Pagini recente » Cod sursa (job #220203) | Cod sursa (job #3226136) | Cod sursa (job #2659771) | Cod sursa (job #445551) | Cod sursa (job #1785460)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
const int N_PRIM = 1000001;
vector <int> a;
vector<bool> prim(N_PRIM);
void ciur() {
fill(prim.begin(), prim.end(), true);
for (int i = 2; i*i <= N_PRIM; i++) {
if (prim[i]) {
for (int j = 2*i; j <= N_PRIM; j+=i ) {
prim[j] = false;
}
}
}
for (int i = 2; i <= N_PRIM; i++) {
if (prim[i]) {
a.push_back(i);
}
}
}
bool next_subset(vector<long long> &a, vector<long long> max_a) {
int n = a.size()-1;
while(n>=0 && a[n]==max_a[n]) n--;
if (n < 0) {
return false;
}
a[n]++;
fill(a.begin()+n+1, a.end(), 0);
}
long long dcount(vector<long long> a) {
long long k = a[0]+1;
for (int i = 1; i < a.size(); i++) {
k*=(a[i]+1);
}
return k;
}
long long dsum(vector<long long> v, vector<long long> p) {
long long s = 1;
for (int i = 0; i < v.size(); i++) {
if (p[i]>0) {
s*=round(pow(v[i], p[i]));
}
}
return s;
}
void solve(long long n, long long &cnt, long long &sum) {
vector<long long> x, y, z;
for (int i = 2; i*i <=n; i++ ) {
int k = 0;
while (n%i==0) {
n/=i;
k++;
}
if (k > 0) {
x.push_back(i);
y.push_back(k);
}
}
if (n > 1) {
x.push_back(n);
y.push_back(1);
}
z.resize(x.size());
fill(z.begin(), z.end(), 0);
long long s = 1;
while (next_subset(z, y)) {
s+=dsum(x, z);
}
sum = s;
cnt = dcount(y);
}
main() {
ifstream cin("ssnd.in");
ofstream cout("ssnd.out");
long long n;
cin>>n;
ciur();
for (int i = 0; i < n; i++) {
long long k, nk, sk;
cin>>k;
solve(k, nk, sk);
cout<<nk<<" "<<sk<<"\n";
}
}