poj3421 X-factor Chains(重複元素的全排列)
阿新 • • 發佈:2018-11-02
題意:給定正整數$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;View Code12 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 }