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;
}
}
本文来自博客园,作者:lei_yu,转载请注明原文链接:https://www.cnblogs.com/lytql/p/15017220.html