您的位置:首页 > 其它

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

2018-04-19 20:19 288 查看

【组合数】

〖相关知识〗

通项公式:$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$ 个的方案数。

〖模板代码〗

#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int N=2e5+5;
const int mod=1e9+7;
int n,m,w,ans,fac
,inv
;
int read()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int power(int a,int b)
{
int ans=1;
while(b)
{
if(b&1)ans=1ll*ans*a%mod;
a=1ll*a*a%mod;b>>=1;
}
return ans;
}
int C(int n,int m){return 1ll*fac
*inv[m]%mod*inv[n-m]%mod;}
int S(int n,int m)
{
int ans=0;
for(int k=0;k<=m;k++)
{
if(k&1)w=-1;else w=1;
w=(1ll*w*C(m,k)%mod+mod)%mod;
w=1ll*w*power(m-k,n)%mod;
ans=(ans+w)%mod;
}
return 1ll*ans*inv[m]%mod;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
w=read(),ans=(ans+w)%mod;
fac[0]=1;
for(int i=1;i<=m;i++)
fac[i]=1ll*fac[i-1]*i%mod;
inv[m]=power(fac[m],mod-2);
for(int i=m;i>=1;i--)
inv[i-1]=1ll*inv[i]*i%mod;
printf("%lld",1ll*(S(n,m)+1ll*(n-1)*S(n-1,m)%mod)%mod*ans%mod);
return 0;
}
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$

                                                                                                                                                                                                                        

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: