poj3421 X-factor Chains(重复元素的全排列)

poj3421 X-factor Chains

题意:给定正整数$x(x<=2^{20})$,求$x$的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的子序列的个数。

显然最大长度就是$x$的质因数个数(一个一个加上去鸭)

而满足最大长度的子序列个数....

这不就是可重复元素的全排列吗!

有这么一个公式,设元素总个数$n$,每个重复元素的个数$m_{i}$,共$k$种不同元素

则全排列个数$=\frac{n!}{\prod_{i=1}^{k}m_{i}!}$

发现$n!(n<=20)$在$longlong$范围内,可以直接处理

素数筛一筛就ok了。

 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 }
View Code

 

posted @ 2018-11-02 12:52  kafuuchino  阅读(151)  评论(0编辑  收藏  举报