zoukankan      html  css  js  c++  java
  • 【算法总结】组合数学相关

    【组合数】

    〖相关知识

    通项公式:$C(n,m)=frac{n!}{m!(n-m)!}$

    递推公式:$C(n,0)=1~(ngeq 0)$$C(n,m)=C(n,n-m)=C(n-1,m-1)+C(n-1,m)~~(1leq mleq n)$

    含义:从 $n$ 个不同的元素中取出 $m$ 个的方案数。

    〖模板代码

    1 int main()
    2 {
    3     for(int i=0;i<N;i++)f[i][0]=1;//注意是0~N而非1~N 
    4     for(int i=1;i<N;i++)
    5         for(int j=1;j<=i;j++)
    6             f[i][j]=(f[i-1][j]+f[i-1][j-1])%mod;
    7     return 0;
    8 }
    View Code

    【第一类斯特林数】

    〖相关知识

    递推公式:$S(n,n)=1~(ngeq 0)$ , $S(n,0)=0~(ngeq 1)$ , $S(n,m)=(n-1)cdot S(n-1,m)+S(n-1,m-1)~~(1leq mleq n-1)$ 

    含义:将 $n$ 个不同的元素组成 $k$ 个环的方案数。

    【第二类斯特林数】

    〖相关知识

    通项公式:$S(n,m)=frac{1}{m!}sum _{k=0}^{m}(-1)^{k}C(m,k)(m-k)^{n}$ (证明详见百度百科

    递推公式:$S(n,n)=1~(ngeq 0)$ , $S(n,0)=0~(ngeq 1)$ , $S(n,m)=mcdot S(n-1,m)+S(n-1,m-1)~~(1leq mleq n-1)$ 

    含义:将 $n$ 个不同的元素拆分成 $m$ 个集合的方案数。

    〖相关题目

    1.【codeforces 961G】Partitions

    题意:见原题

    分析:无

     1 #include<cstdio>
     2 #include<algorithm> 
     3 #include<cstring>
     4 #define LL long long
     5 using namespace std;
     6 const int N=2e5+5;
     7 const int mod=1e9+7;
     8 int n,m,w,ans,fac[N],inv[N];
     9 int read()
    10 {
    11     int x=0,f=1;char c=getchar();
    12     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    13     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    14     return x*f;
    15 }
    16 int power(int a,int b)
    17 {
    18     int ans=1;
    19     while(b)
    20     {
    21         if(b&1)ans=1ll*ans*a%mod;
    22         a=1ll*a*a%mod;b>>=1;
    23     }
    24     return ans;
    25 }
    26 int C(int n,int m){return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;}
    27 int S(int n,int m)
    28 {
    29     int ans=0;
    30     for(int k=0;k<=m;k++)
    31     {
    32         if(k&1)w=-1;else w=1;
    33         w=(1ll*w*C(m,k)%mod+mod)%mod;
    34         w=1ll*w*power(m-k,n)%mod;
    35         ans=(ans+w)%mod;
    36     }
    37     return 1ll*ans*inv[m]%mod;
    38 }
    39 int main()
    40 {
    41     n=read();m=read();
    42     for(int i=1;i<=n;i++)
    43         w=read(),ans=(ans+w)%mod;
    44     fac[0]=1;
    45     for(int i=1;i<=m;i++)
    46         fac[i]=1ll*fac[i-1]*i%mod;
    47     inv[m]=power(fac[m],mod-2);
    48     for(int i=m;i>=1;i--)
    49         inv[i-1]=1ll*inv[i]*i%mod;
    50     printf("%lld",1ll*(S(n,m)+1ll*(n-1)*S(n-1,m)%mod)%mod*ans%mod);
    51     return 0;
    52 }
    View Code

    【贝尔数】

    〖相关知识

    递推公式:$B(0)=1$$B(n+1)=sum _{k=0}^{n}inom{n}{k}B(k)$

    含义:基数为 $n$ 的集合划分数。

    与第二类斯特林数的关系:$B(n)=sum _{k=1}^{n}S(n,k)$

    【卡特兰数】

    〖相关知识

    递推公式:$H(0)=1$ ,$H(1)=1$ ,$H(n)=H(0)H(n-1)+H(1)H(n-2)+cdots +H(n-1)H(0)$

                     $H(n)=frac{H(n-1)cdot (4n-2)}{n+1}$

                     $H(n)=frac{C(2n,n)}{n+1}=C(2n,n)-C(2n,n-1)$

    【错排公式】

    〖相关知识

    通项公式:$f(n)=n!cdotsum_{i=2}^{n}frac{(-1)^i}{i!}$

    递推公式:$f(n)=(n-1)cdot (f(n-1)+f(n-2))$

                     $f(n)=sum_{i=0}^{n}(-1)^icdotinom{n}{i}cdot(n-i)!=sum_{i=0}^{n}(-1)^icdotfrac{n!}{i!}=(-1)^n+sum_{i=0}^{n-1}(-1)^icdotfrac{n!}{i!}=(-1)^n+ncdot f(n-1)$

    【二项式反演】

    〖相关知识

    二项式定理:$(x+y)^n=sum_{i=0}^{n}inom{n}{i}x^iy^{n-i}$

    二项式反演:$b_n=sum_{i=0}^{n}inom{n}{i}a_iRightarrow a_n=sum_{i=0}^{n}(-1)^{n-i}inom{n}{i}b_i$

                         $b_k=sum_{i=k}^{n}inom{i}{k}a_iRightarrow a_k=sum_{i=k}^{n}(-1)^{i-k}inom{i}{k}b_i$

                                                                                                                                                                                                                            

  • 相关阅读:
    問題集リンク(DEV I)
    認定Platformデベロッパー 試験範囲
    React 学习资源
    IIS
    小学校
    リストに項番をつける
    七、JavaScript函数
    六、JavaScript数组
    五、JavaScript流程控制
    四、JavaScript操作符
  • 原文地址:https://www.cnblogs.com/zsnuo/p/8810329.html
Copyright © 2011-2022 走看看