题意:给定正整数$x(x<=2^{20})$,求$x$的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的子序列的个数。
显然最大长度就是$x$的质因数个数(一个一个加上去鸭)
而满足最大长度的子序列个数....
这不就是可重复元素的全排列吗!
有这么一个公式,设元素总个数$n$,每个重复元素的个数$m_{i}$,共$k$种不同元素
则全排列个数$=\frac{n!}{\prod_{i=1}^{k}m_{i}!}$
发现$n!(n<=20)$在$longlong$范围内,可以直接处理
素数筛一筛就ok了。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define re register 5 using namespace std; 6 #define N 1048577 7 int n,v[N],pri[N],cct,cnt; 8 long long fac[23],ans,tmp; 9 int main(){ 10 for(int i=2;i<N;++i){ 11 if(!v[i]) v[i]=pri[++cct]=i; 12 for(int j=1;j<=cct;++j){ 13 if(pri[j]>i||pri[j]*i>=N) break; 14 v[pri[j]*i]=pri[j]; 15 } 16 }fac[0]=1; 17 for(int i=1;i<=20;++i) fac[i]=fac[i-1]*i; 18 while(cin>>n){ 19 cnt=0;tmp=1; 20 for(int i=1,j=n;i<=cct&&j>1&&pri[i]<=n;++i){ 21 int a=0; 22 while(j%pri[i]==0&&j>1) ++a,++cnt,j/=pri[i]; 23 tmp*=fac[a]; 24 }ans=fac[cnt]/tmp; 25 cout<<cnt<<" "<<ans<<endl; 26 }return 0; 27 }