T186330 X-factor Chain 题解

结论题呢

我们首先考虑数$1080=2^3*3^3*7$

为了让前一个数能够整除后一个数,即后一个数能够被前一个数整除,我们必须有$x_i=kx_{i+1}$,且$x_i$和$kx_{i+1}$都是数$n$的因数,故$k$也应该是$n$的因数。

但是我们需要让这个序列最长,所以每一次乘的数$k$应该是原数的最小质因子,否则可以分解成更多的数。

所以第一个答案就是质因子个数,对于1040来说就是$3+3+1=7$

再考虑下一个问题

对于1040,显然我们可以稍微转化一下,假设这个序列一开始是

1 1 1 1 1 1 1

接下来在每一个位置乘任意一个质因子,得到的序列都是合法的最长序列

即在7个位置中选三个位置乘2,再在4个位置中选三个位置乘3,最后在一个位置中找一个位置乘7

显然,答案就是$C_7^3C_4^3C_1^1=140$

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
//#define int long long
using namespace std;
inline int r()
{
	int s=0,k=1;char c=getchar();
	while(!isdigit(c))
	{
		if(c=='-')k=-1;
		c=getchar();
	}
	while(isdigit(c))
	{
		s=s*10+c-'0';
		c=getchar();
	}
	return s*k;
}
int t,n,prime[1000001],b[1000001],cnt,q,f[1000001];
void divide(int x)
{
	for(int i=1;i<=cnt;i++)
	{
		if(prime[i]>x)break;
		if(x%prime[i]==0)t++;
		while(x%prime[i]==0)
		{
			//cout<<prime[i]<<" ";
			f[t]++;
			x/=prime[i];
		}
	}
}
int cal_c(int n,int m)
{
	int x=1;
	for(int i=n;i>n-m;i--)
	x*=i;
	for(int i=1;i<=m;i++)
	x/=i;
	return x;
}
signed main()
{
	freopen("test.in","r",stdin);
	freopen("a.out","w",stdout);
	for(int i=2;i<=1e6;i++)
	{
		if(!b[i])prime[++cnt]=i;
		for(int j=1;j<=cnt&&i*prime[j]<=1e6;j++)
		{
			b[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
	while(cin>>n)
	{
		int ans1=0,ans2=1;
		memset(f,0,sizeof(f));
		t=0;
		divide(n);
		for(int i=1;i<=t;i++)ans1+=f[i];
		cout<<ans1<<" ";
		for(int i=1;i<=t;i++)
		{
			ans2*=cal_c(ans1,f[i]);
			ans1-=f[i];
		}
		cout<<ans2<<endl;
	}
}
posted @ 2021-07-15 19:41  lei_yu  阅读(32)  评论(0编辑  收藏  举报