X-因子链

题目描述
给一个正整数X,一个长度为m的X-因子链是指这样一个序列:X0=1,X1,X2,。。。,Xm=X满足:Xi<Xi+1同时Xi|Xi+1(Xi+1能被Xi整除)
要求X-因子链的最大长度Len和长度为Len的X-因子链的数量。

输入
一个正整数X
输出
一行,两个整数,分别表示最大长度和该长度链的种数。
输入样例复制
100
输出样例复制
4 6
说明
对于20%的数据:X<=20,000;
对于100%的数据:X<=2^31;且保证因子链最大长度小于等于20;

.
.
.
.
.
.
分析
最长的长度取决于质因数的个数,也就是第一问答案len。
最长长度的个数相当于把最长质因数的排列个数。而有相同元素的排列数等于(len!)/(相同元素重复个数)!
例如100=225*5,第二位答案就是4!/(2!*2!)=6。两个2!分别表示2因子与5因子出现了两次,出现几次就除以几的阶乘。

.
.
.
.
.
程序:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const long long maxn=(1<<20)+10; 
bool b[maxn];
int prime[maxn],p[maxn],cnt; 

int main ()
{
	memset(b,true,sizeof(b));
	b[1]=false;
    for (int i=2;i<=maxn;i++)
		for (int j=2;i*j<=maxn;j++)
			b[i*j]=false;
    for (int i=2;i<=maxn;i++)
		if (b[i]==true) prime[++cnt]=i;
		
    long long x,now,ans=0;
	cin>>x;
    for (int i=1;i<=cnt;i++)
    	if (x==1)
    	{
    		now=i;
			break;
    	} else
    	{
    		while (x%prime[i]==0&&x>0)
    		{
    			x/=prime[i];
				p[i]++;
				ans++;
    		}
    	}
    cout<<ans<<" ";
    long long a1=1;
    for (long long i=1;i<=ans;i++)
		a1*=i;
    for (int i=1;i<=now;i++)
    	if (p[i])
    	{
    		for (long long j=2;j<=p[i];j++)
				a1/=j;
    	}
    cout<<a1;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值