【算法总结】组合数学相关
【组合数】
〖相关知识〗
通项公式:$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 }
【第一类斯特林数】
〖相关知识〗
递推公式:$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 }
【贝尔数】
〖相关知识〗
递推公式:$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$