问题: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; }