二项式反演与错排问题

二项式反演与错排问题

常见简单组合恒等式:

  1. \(C_n^m=C_n^{n-m}\)
  2. \(C_n^m=C_n^{m-1}+C_{n-1}^{m-1}\)
  3. \(\sum_{i=0}^{n}C_n^i=2^i\)
  4. \(\sum_{i=0}^{n}(-1)^i*C_n^i=[n=0]\)

3.4.证明:由二项式定理易证。

令\(x=1,y=1\),可得3式

令\(x=1,y=-1\), 可得4式

二项式反演:

假设存在两个函数f,g。满足:
\[
f_n=\sum_{i=0}^{n}C_n^i*g_i
\]
那么考虑如何反求得\(g_n\)关于\(f_n\)的等式。
\[
g_n=\sum_{i=0}^{n}[n-i=0]*C_n^i*g_i\g_n=\sum_{i=0}^{n}\sum_{j=0}^{n-i}(-1)^j*C_{n-i}^j*C_n^i*g_i\g_n=\sum_{i=0}^{n}\sum_{j=0}^{n-i}(-1)^j*C_{n}^j*C_{n-j}^i*g_i\g_n=\sum_{j=0}^{n}(-1)^j*C_n^j\sum_{i=0}^{n-j}C_{n-j}^i*g_i\g_n=\sum_{i=0}^{n}(-1)^i*C_n^i*f_{n-i}=\sum_{i=0}^{n}(-1)^{n-i}*C_n^i*f_{i}
\]
所以得到二项式反演的结论:
\[
f_n=\sum_{i=0}^{n}C_n^i*g_i\g_n=\sum_{i=0}^{n}(-1)^{n-i}*C_n^i*f_{i}\\]
形式上真的很优美!

下面就用二项式反演来解决一个经典的问题!

错排问题

问题描述:

有\(n\)个人编号为\(1, ..., n\),问这\(n\)个人站成一排全都站错位置的方案数。

上述站错的定义是:第\(i\)个人没有站在位置\(i\)上。

方法1: 递推

设\(f_n\)表示答案,假设现在考虑到了前\(i\)个人的方案,即\(f_i\)。

考虑第\(i\)个人站位情况:

显然第\(i\)个人的不能站在位置\(i\),假设他站到了位置\(k\),显然\(k\in[1,i-1]\),那么继续考虑\(k\)的站位。

? ①、\(k\)站到了位置i,那么剩下的\(i-2\)个人仍然构成一个原问题,方案数为\(f_{i-2}\)。

? ②、\(k\)没站到位置i,也即\(k\)不能站在位置\(i\),那么剩下的\(i-1\)个人仍然构成一个原问题,方案数为\(f_i-1\)。

所以可以得到\(f\)的递推关系:
\[
f_1=0\ , \ f_2=1\\f_i=(i-1)*(f_{i-1}+f_{i-2})\ \ i≥3
\]

方法2:二项式反演

设\(f_n\)表示\(n\)个人随便站位的方案数,\(g_n\)表示\(n\)个人的都站错的方案数。

容易得到:
\[
f_n=n!\f_n=\sum_{i=0}^nC_n^i*g_i
\]
直接二项式反演可以得到:
\[
g_n=\sum_{i=0}^{n}(-1)^{n-i}*C_n^i*f_{i}\\]
同样可以直接线性的递推出答案。

原文地址:https://www.cnblogs.com/Bhllx/p/11562988.html

时间: 2024-11-12 07:48:28

二项式反演与错排问题的相关文章

[bzoj3622]已经没有什么好害怕的了——容斥or二项式反演+DP

题目大意: 给定两个长度为\(n\)的序列,求有多少种匹配方式,使得\(a_i<b_i\)的个数恰好为\(k\)个. 思路: 据说是一道二项式反演的经典例题了. 首先如果要求正好等于\(k\)个的是不太好求的,我们可以考虑求出至少为\(k\)个的方案数. 首先先把两个序列都按照从小到大的顺序排好序,然后以序列\(b\)为对象dp. 我们设\(f_{i,j}\)表示前\(i\)个数里面强制确定了\(j\)个\(a_i<b_i\)关系的方案数,记\(c_i\)表示在\(a\)中有多少个数<\

BZOJ 4517: [Sdoi2016]排列计数 错排+逆元

4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. T=500000,n≤1000000,m≤1000000 Output 输出 T 行,每行一个数,表示

HDU 2048 错排

错排递推公式: d(n) = (n-1)*(d[n-1]+d[n-2]): 证明:将第n个元素放到第k处,第k处的元素如果放到第n处,就是d(n-2),否则,先假设放到第n处,然后错排,就是d(n-1): 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 double fac[22] = {1,1}; 6 double d[22] = {0,0,1,2}; 7 8 int main() 9 { 10 for(int i=1;i<

错排问题

问题: 十本不同的书放在书架上.现重新摆放,使每本书都不在原来放的位置.有几种摆法? 这个问题推广一下,就是错排问题,是组合数学中的问题之一. 考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排. n个元素的错排数记为D(n). 研究一个排列错排个数的问题,叫做错排问题或称为更列问题. 错排问题最早被尼古拉·伯努利和欧拉研究,因此历史上也称为伯努利-欧拉的装错信封的问题.这个问题有许多具体的版本,如在写信时将n封信装到n个不同的信封里,有

二项式反演

问:给你k种颜色,你必须用上所有颜色去涂满n个相邻的格子,并且要求相邻格子的颜色不同,求方案数. 我们设必须用 i 种颜色两两不相邻的涂格子的方案数为 b(i) ; 很明显: ,我们令 a(k)=k·(k-1)n-1 , 然后有. 如果你知道二项式反演的话,那么这个问题就已经解决了,因为. 是不是觉得二项式反演很厉害,下面我将给出它的证明. 二项式反演公式: 证明: 然后让我们对进行分析: 我们预热一下: 有A,B,C,D,E,F,G 7个人,我们要先从中选出4个候选人,再从中选出3个作为mas

lightoj 1095 - Arrange the Numbers (错排数)

题意: 求n个数的排列,前m个中有k个在自己的位置上的方法数. 思路: 设D[n]为n个元素的错排数. 于是我们有D[1] = 0 D[2] = 1: D[n] = (D[n-1] + D[n-2]) * (i-1) 考虑问题本身,我们首先从前m个数选k个数不动.即C(m,k).对于没有选的前m中的m-k个数肯定是参与了错排,而后面n-m个数中参加错排的个数不定,所以我们枚举一个后面n-m个数中选出i(0 <= i <= n - m)个数有没有参与错排.总共就有n-k-i参与了错排. 综上所述

不容易系列之一(hdu1465)错排+递推

不容易系列之一 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16646 Accepted Submission(s): 6935 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样.话

杭电---2068 RPG的错排

Problem Description  今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔:第二次猜:R是草儿,P是月野兔,G是公主:第三次猜:R是草儿,P是公主,G是月野兔:......可怜的野骆驼第六次终于把RPG分清楚了.由于RPG的带动,做ACM的女生越来越多,我们的野骆驼想都知道她们,可现在有N多人,他要猜的次数可就多了,为了不为难野骆驼,女生们只

hdu 1465(不容易系列之一)(水题,错排公式)(a[n]=(n-1)*(a[n-1]+a[n-2]))

不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14924    Accepted Submission(s): 6207 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好"一件"事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总