【算法总结】组合数学相关

【组合数】

〖相关知识

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

递推公式:$C(n,0)=1~(n\geq 0)$$C(n,m)=C(n,n-m)=C(n-1,m-1)+C(n-1,m)~~(1\leq m\leq 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~(n\geq 0)$ , $S(n,0)=0~(n\geq 1)$ , $S(n,m)=(n-1)\cdot S(n-1,m)+S(n-1,m-1)~~(1\leq m\leq 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~(n\geq 0)$ , $S(n,0)=0~(n\geq 1)$ , $S(n,m)=m\cdot S(n-1,m)+S(n-1,m-1)~~(1\leq m\leq 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}\binom{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!\cdot\sum_{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)^i\cdot\binom{n}{i}\cdot(n-i)!=\sum_{i=0}^{n}(-1)^i\cdot\frac{n!}{i!}=(-1)^n+\sum_{i=0}^{n-1}(-1)^i\cdot\frac{n!}{i!}=(-1)^n+n\cdot f(n-1)$

【二项式反演】

〖相关知识

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

二项式反演:$b_n=\sum_{i=0}^{n}\binom{n}{i}a_i\Rightarrow a_n=\sum_{i=0}^{n}(-1)^{n-i}\binom{n}{i}b_i$

                     $b_k=\sum_{i=k}^{n}\binom{i}{k}a_i\Rightarrow a_k=\sum_{i=k}^{n}(-1)^{i-k}\binom{i}{k}b_i$

                                                                                                                                                                                                                        

posted @ 2018-04-19 20:19  Zsnuo  阅读(235)  评论(0编辑  收藏  举报