http://poj.org/problem?id=3421
将一个数X分解成从1到X的数列,前一个数可以整除后一个数,求最大链长和链的个数。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <numeric>
#include <algorithm>
using namespace std;
vector <int> prime_factor_time(int n){
vector <int> v;
for (int i=2;i*i<=n;i++){
int t=0;
while (n%i==0){
t++;
n/=i;
}
v.push_back(t);
}
if (n!=1){
v.push_back(1);
}
return v;
}
long long factor(int n){
long long res=1;
for (int i=1;i<=n;i++){
res*=i;
}
return res;
}
int main(){
int n;
while (cin >> n){
vector <int> f=prime_factor_time(n);
int len= accumulate(f.begin(),f.end(),0);
long long num=factor(len);
for (vector <int>::iterator it=f.begin();it!=f.end();it++){
num/=factor(*it);
}
cout << len << " " << num << endl;
}
}