问题:X-factor Chains POJ - 3421
给定一个正整数X, 一个长度为m的X-因子链是由m+1个整数组成的。其中
1 = X0, X1, X2, …, Xm = X 满足Xi < Xi+1 且 Xi 整除 Xi+1 。
现在要求X-因子链的最大长度和最大长度有多少条?
Input
Output
Sample Input
多组数据,每一组数据一个正整数X (X ≤ 220).
对于每组数据,输出X-因子链的最大长度和最大长度有多少条
2 3 4 10 100Sample Output
1 1 1 1 2 1 2 2 4 6
分析:
如何理解这道题中的最大长度和最大长度有几条,简单来说就是,当前一个数到后一个数都乘的是素因数的时候,长度会最长,这就要求先将输入的数因数分解,输出素因数的个数(相同的素因数不能算成一个),其次,如果改变素因数乘上去的顺序,就可以得到长度相同,但是中间数有差异的序列,说一最大长度的条数就是所有素因数的排列数,由于素因数可能有相同的,所以记得要除序(就是一个简单的排列问题了);
还有就是可以先把1024*1024范围内的素因数都找出来,就不用每考查一个数都去看一看有哪些素数了;
关于排列数,由于本题最多可能有20个素因数(即20个2),则考虑20!=2.4329020081766 * 10 ^18,19位勉勉强强可以使用long long(+-9223372036854775807,19位)存储
代码:
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
bool a[1100*1100];//不是素数为真
vector<int> yinshu;
int main(){
memset(a,0,sizeof(a));
for(int i=2;i<=1024*1024;i++){
if(a[i]==0){
for(int j=i*2;j<1024*1024;j+=i){
a[j]=1;
}
}
}
int n;
while(cin>>n){
int N=0;yinshu.clear();
int tn=n;
for(int i=2;i<=tn;i++){
if(a[i]==0){
int num=0;
while(tn%i==0){
num++;tn/=i;
}
if(num>0){
yinshu.push_back(num);
N+=num;
}
}
}
ll ANN=1;
for(int i=2;i<=N;i++){
ANN*=i;
}
for(int i=0;i<yinshu.size();i++){
ll Ann=1;
for(int j=2;j<=yinshu[i];j++){
Ann*=j;
}
ANN/=Ann;
}
cout<<N<<' '<<(ll)ANN<<endl;
}
return 0;
}