列表

详情


NC50561. X-factor Chain

描述

输入正整数x,求x的大于1的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的序列的个数。

输入描述

多组数据,每组数据一行,包含一个正整数x。

输出描述

对于每组数据,输出序列的最大长度以及满足最大长度的序列的个数。

示例1

输入:

2
3
4
10
100

输出:

1 1
1 1
2 1
2 2
4 6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 22ms, 内存消耗: 5504K, 提交时间: 2019-08-23 09:15:37

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1200000;
int vis[N],prime[N],tot=0;
ll fac[35];
void get(){
	fac[1]=1;
	fac[0]=1;
	for(int i=2;i<=20;i++)
		fac[i]=fac[i-1]*i;
	memset(vis,0,sizeof(vis));
	for(int i=2;i<=N;i++){
		if(!vis[i])
			prime[++tot]=i;
		for(int j=1;j<=tot&&prime[j]*i<=N;j++){
			vis[prime[j]*i]=1;
			if(i%prime[j]==0)
				break;
		}
	}
}
int main(){
	get();
	int n;
	while(~scanf("%d",&n)){
		int s1=0;
		ll s2=1;
		for(int i=1;i<=tot&&prime[i]*prime[i]<=n;i++){
			int cnt=0;
			if(n==1)
				break;
			if(n%prime[i]!=0)
				continue;
			while(n%prime[i]==0){
				n/=prime[i];
				cnt++;
			}
			s1+=cnt;
			s2*=fac[cnt];
		}
		if(n!=1)
			s1++;
		printf("%d %lld\n",s1,fac[s1]/s2);
	}
	return 0;
} 

C++11(clang++ 3.9) 解法, 执行用时: 33ms, 内存消耗: 376K, 提交时间: 2020-06-01 23:07:40

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long fact[50]={0,1},x;
	int i;
	for(i=2;i<=20;i++)
	{
		fact[i]=fact[i-1]*i;
	}
	while(cin>>x)
	{
		long long sum=1,len=0;
		for(i=2;i*i<=x;i++)
		{
			int cnt=0;
			if(x%i==0)
			{
				while(x%i==0)
				{
					x/=i;
					cnt++;
				}
				len+=cnt;
				sum*=fact[cnt];
			}
		}
		if(x>1)
		len++;
		cout<<len<<" "<<fact[len]/sum<<endl;
	}
}

C++(g++ 7.5.0) 解法, 执行用时: 8ms, 内存消耗: 352K, 提交时间: 2022-08-23 19:34:59

#include<cstdio>
int main()
{
	for(int x;~scanf("%d",&x);)
	{
		int ans=1,c1=0,c2;
		for(int i=2;i*i<=x;i++)for(c2=0;x%i==0;)ans*=++c1,ans/=++c2,x/=i;
		if(x>1)ans*=++c1;
		printf("%d %d\n",c1,ans);
	}
	return 0;
}

上一题