1. 程式人生 > >poj3421 X-factor Chains(重複元素的全排列)

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