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

 

转载于:https://www.cnblogs.com/kafuuchino/p/9895659.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值