zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    C#
    C#
    SQLServer
    C#
    使用Spring Boot快速构建应用
    mysql (master/slave)复制原理及配置
    Mysql 半同步复制配置
    Mysql+keeplived+lvs
    Mysql实时双备
    mysqlbinlog 用法
  • 原文地址:https://www.cnblogs.com/kafuuchino/p/9895659.html
Copyright © 2011-2022 走看看