POJ 3421 X-factor Chains(素性检测+因数查找+排列数计算)

问题:X-factor Chains POJ - 3421

给定一个正整数X, 一个长度为m的X-因子链是由m+1个整数组成的。其中

1 = X0, X1, X2, …, Xm = X 满足Xi < Xi+1Xi 整除 Xi+1 。

现在要求X-因子链的最大长度和最大长度有多少条?

Input

多组数据,每一组数据一个正整数X (X ≤ 220).

Output

对于每组数据,输出X-因子链的最大长度和最大长度有多少条

Sample Input
2
3
4
10
100
Sample 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;
}

猜你喜欢

转载自blog.csdn.net/qq_41333528/article/details/80147244