1295. X的因子链

#include <bits/stdc++.h>
using namespace std;
const int N = (1 << 20) + 10;
int fact[30], sum[N]; //fact存储质因子,sum存储质因子的个数
int primes[N], cnt, minp[N]; //minp存储每个数的最小质因子
bool st[N];
void get_primes(int n) {
for(int i = 2; i <= n; ++i){
if(!st[i]) {primes[cnt++] = i; minp[i] = i;}
for(int j = 0; primes[j] * i <= n; ++j){
int t = primes[j] * i;
st[t] = true;
minp[t] = primes[j];
if(i % primes[j] == 0) break;// 通过最小质因子来筛
}
}
}
signed main(){
get_primes(N);
int x;
while(cin >> x){
int total = 0, k = 0;
while(x > 1){
int p = minp[x];
fact[k] = p, sum[k] = 0;
while(x % p == 0){
sum[k]++;
total++;
x /= p;
}
++k;
}
long long res = 1;
for(int i = 1; i <= total; ++i) res *= i;
for(int i = 0; i < k; ++i){
for(int j = 1; j <= sum[i]; ++j){
res /= j;
}
}
cout << total << " " << res << endl;
}
return 0;
}