二项式 容斥原理学习笔记

news/2025/1/7 23:33:37/文章来源:https://www.cnblogs.com/Eous/p/18656283

容斥原理

先从容斥原理开始。

容斥原理的结论如下:

\[|\bigcup\limits_{i = 1}^{n}S_{i}| = \sum\limits_{m = 1}^{n}(-1)^{m - 1}\sum\limits_{a_{i} < a_{i - 1}}|\bigcap_{i = 1}^{m}S_{a_{i}}| \]

证明的思路是考虑一个元素在每一个 \(\bigcap\limits_{i = 1}^{m}S_{a_{i}}\) 里出现的次数,然后通过一番暴算,我们能够发现每个元素都只出现了 \(1\) 次,这样,每个元素合起来就变成了总的并集。

详见 OI-wiki

二项式反演

反演的定义

现在我们有两个数组:\(g\)\(f\)。而 \(f\)\(g\) 之间有对应关系:

\[f_{n} = \sum\limits_{i = 0}^{n}a_{i} \times g_{i} \]

然而题目里不可能这么简单,一般是已知 \(f\) 让我们推 \(g\)。这种情况解个方程就可以。但是如果只有解方程的话,还不足以搞出反演这种东西出来,而上面的柿子在某些情况下会化出许多种优美的形式,所以才搞出了反演这种东西。

二项式反演的公式

我们可以从容斥原理推到二项式反演的公式。

有全集 \(U = S_{1} \cup S_{2} \cup S_{3} \cup \cdots \cup S_{n}\),且任意 \(i\) 个集合的交集和并集大小相同。设 \(f_{i}\) 表示任意 \(i\) 个集合的并集的大小,\(g_{i}\) 表示任意 \(i\) 个集合的补集的大小。特别的,\(g_{0} = f_{0} = |U|\)。根据补集的交集和原集的并集的容斥关系可以得出:

\[\begin{aligned} |\bigcap\limits_{i = 1}^{n}S_{i}| & = |U| - |\bigcup\limits_{i = 1}^{n}\overline{S_{i}}| \\ & = |U| - (|\overline{S_{1}}| + |\overline{S_{2}}| + \cdots + (-1)^{n - 1}|\overline{S_{1}} \cap \overline{S_{2}} \cap \cdots \cap \overline{S_{n}}|) \\ & = |U| - |\overline{S_{1}}| - |\overline{S_{2}}| - \cdots + (-1)^{n}|\overline{S_{1}} \cap \overline{S_{2}} \cap \cdots \cap \overline{S_{n}}| \\ & = \sum\limits_{i = 0}^{n}(-1)^{i}\binom{n}{i}g_{i} \end{aligned} \\ \begin{aligned} |\bigcap\limits_{i = 1}^{n}\overline{S_{i}}| & = |U| - |\bigcup\limits_{i = 1}^{n}S_{i}| \\ & = |U| - (|S_{1}| + |S_{2}| + \cdots + (-1)^{n - 1}|S_{1} \cap S_{2} \cap \cdots \cap S_{n}|) \\ & = |U| - |S_{1}| - |S_{2}| - \cdots + (-1)^{n}|S_{1} \cap S_{2} \cap \cdots \cap S_{n}|) \\ & = \sum\limits_{i = 0}^{n}(-1)^{i}\binom{n}{i}f_{i} \end{aligned} \]

然而,我们惊奇的发现:\(|\bigcap\limits_{i = 1}^{n}S_{i}| = f_{n},|\bigcap\limits_{i = 1}^{n}\overline{S_{i}}| = g_{n}\),于是我们便得到了二项式反演的第一个公式:

\[f_{n} = \sum\limits_{i = 0}^{n}(-1)^{i}\binom{n}{i}g_{i} \Longleftrightarrow g_{n} = \sum\limits_{i = 0}^{n}(-1)^{i}\binom{n}{i}f_{i} \]

如何用数学方法证明这个公式是正确的呢?直接代入就行。
\(f_{n} = \sum\limits_{i = 0}^{n}(-1)^{i}\binom{n}{i}g_{i}\) 代入:

\[\begin{aligned} g_{n} & = \sum\limits_{i = 0}^{n}(-1)^{i}\binom{n}{i}\sum\limits_{j = 0}^{i}(-1)^{j}\binom{i}{j}g_{j} \\ & = \sum\limits_{i = 0}^{n}\sum\limits_{j = 0}^{i}(-1)^{i + j}\binom{n}{i}\binom{i}{j}g_{j} \\ & = \sum\limits_{i = 0}^{n}\sum\limits_{j = 0}^{i}(-1)^{i + j}\binom{n}{j}\binom{n - j}{n - i}g_{j} \\ & = \sum\limits_{j = 0}^{n}\binom{n}{j}g_{j}\sum\limits_{i = 0}^{n - j}(-1)^{i}\binom{n - j}{i} \\ & = \sum\limits_{j = 0}^{n}\binom{n}{j}g_{j}[j = n] \\ & = g_{n} \end{aligned} \]

显然成立。当然,这个柿子里还有一些不那么显然的东西

  1. \(\displaystyle\binom{n}{i}\binom{i}{j} = \binom{n}{j}\binom{n - j}{n - i}\)
    这个可以用数学方法证明,也可组合意义的方法证明,这里主要说明组合意义的证法。
    \(|U| = n,|A| = i,b = |j|,B \subseteq A \subseteq U\) 的方案数。这里有两种方法:
    法一:先在 \(U\) 里取 \(i\) 个元素构成集合 \(A\),方案数为 \(\binom{n}{i}\),然后在 \(i\) 个元素里再取 \(j\) 个元素构成集合 \(B\),方案数为 \(\binom{i}{j}\),合起来就是 \(\binom{n}{i}\binom{i}{j}\)
    法二:先在 \(U\) 里取 \(j\) 个元素构成集合 \(B\),方案数为 \(\binom{n}{j}\),再在剩下的 \(n - j\) 个元素里取 \(i - j\) 个元素,方案数为 \(\binom{n - j}{i - j}\),又有 \(\binom{n - j}{i - j} = \binom{n - j}{n - i}\),所以方案数就是 \(\binom{n}{j}\binom{n - j}{n - i}\)
    得证。
  2. \(\displaystyle\sum\limits_{i = 0}^{n - j}(-1)^{i}\binom{n - j}{i} = [j = n]\)
    \(k = n - j\),令 \(k = 0\),原式的值为 \(1\),令 \(k > 0\),原式为 \(\sum\limits_{i = 0}^{k}\binom{k}{i}(-1)^{i}\),我们来添一个项:\(\sum\limits_{i = 0}^{k}\binom{k}{i}(-1)^{i} 1^{i}\),发现,这玩意不就是二项式定理的的右边那坨吗?那么原式就是 \((-1 + 1)^{k} = 0^{k} = 0\)。得证。

现在再看那个式子就比较好懂了。注意再第二点那里,因为数学老师告诉我们 \(0^{0}\) 没有意义,所以在证明的时候为了严谨需要分类讨论。在做题的时候,为了方便可以钦定 \(0^{0} = 1\)

小结

二项式反演的 \(4\) 种形式:

形式一

\[f_{n} = \sum\limits_{i = 0}^{n}(-1)^{i}\binom{n}{i}g_{i} \Longleftrightarrow g_{n} = \sum\limits_{i = 0}^{n}(-1)^{i}\binom{n}{i}f_{i} \]

形式二(形式一的变形,比较常用):

\[f_{n} = \sum\limits_{i = 0}^{n}\binom{n}{i}g_{i} \Longleftrightarrow g_{n} = \sum\limits_{i = 0}^{n}(-1)^{n - i}\binom{n}{i}f_{i} \]

形式三:

\[f_{n} = \sum\limits_{i = n}^{m}(-1)^{i}\binom{i}{n}g_{i} \Longleftrightarrow g_{n} = \sum\limits_{i = n}^{m}(-1)^{i}\binom{i}{n}f_{i} \]

形式四(形式三的变形,非常常用):

\[f_{n} = \sum\limits_{i = n}^{m}\binom{i}{n}g_{i} \Longleftrightarrow g_{n} = \sum\limits_{i = n}^{m}(-1)^{i - n}\binom{i}{n}f_{i} \]

为什么形式四非常常用呢?因为题里多半都是求恰好满足一些条件的方案数。而我们好求的一般都是钦定满足一些条件的方案数。比如:有 \(m\) 个条件,\(g_{i}\) 表示恰好满足 \(i\) 个条件的方案数,\(f_{i}\) 表示钦定满足 \(i\) 个条件,剩下的随便的方案数。从 \(f_{i}\) 的表述里就可以看出,\(f_{i}\)\(g_{i}\) 好求很多,我们就可以用 \(f\) 推得 \(g\)

推导思路和证明思路来自 __allenge 的博客。

例题 for 暴力容斥

P1450 [HAOI2008] 硬币购物

我们先考虑没有限制的情况:\(dp_{i}\) 表示没有限制的情况下买价格为 \(i\) 的物品的方案数,容易发现这就是一个完全背包,可以在 \(\mathcal{O}(val)\) 的复杂度下预处理,其中 \(val\) 表示最大价格。然后接下来考虑限制的情况。发现正着考虑不超过限制的情况不太好做,正难则反
我们考虑超过限制的情况。超过限制就是第 \(i\) 个硬币强制选 \(d_{i} + 1\) 个,剩下的依然随便选,那么情况数就是 \(dp_{s - (d_{i} + 1) \times c_{i}}\),答案就要减去 \(\sum\limits_{i = 1}^{4}dp_{s - (d_{i} + 1) \times c_{i}}\)。这是单个硬币超出限制的情况,如果有多个硬币,就得请出我们的容斥原理了。但是,容斥原理的公式要求任意两个集合的交集和并集大小相等,这很明显不相等啊,我们又发现:只有 \(4\) 种硬币,那我们直接枚举不就行了吗?无非就是带一个 \(16\) 的常数嘛。

核心代码:

int ans = dp[s];//dp是预处理好的完全背包
for (int k = 1; k < (1 << 4); k++)
{int tmp = s;for (int i = 0; i < 4; i++)if (k & (1 << i))tmp -= (d[i] + 1) * c[i];if (tmp >= 0)ans += (__builtin_popcount(k) & -1 : 1) * dp[tmp];//容斥
}

P6521 [CEOI2010 day2] pin

发现考虑不同的方案数有点难,正难则反
我们设 \(cnt_i\) 为钦定有 \(i\) 位相同的方案数。这个可以用哈希求解。我们设哈希函数:

int hsh(char ch){return isdigit(ch) ? ch - '0' : ch - 'a' + 10;}
int hsh(char ch1,char ch2){return hsh(ch1) * 36 + hsh(ch2);}
int hsh(char ch1,char ch2,char ch3)
{return hsh(ch1) * 36 * 36 + hsh(ch2) * 36 + hsh(ch3);}

分别用于求解一个字符,两个字符,三个字符的哈希值。很明显,这个哈希函数生成的哈希值不会超过 \(6 \times 10 ^ 4\)。那么我们记录 \(tmp_{i}\) 表示有多少个字符序列的哈希值是 \(i\),然后要求解方案数呢,就相当于求解\(tmp_{i}\) 个元素里随便取两个不同元素的方案数,很明显是 \(\frac{tmp_{i} \times (tmp_{i} - 1)}{2}\)。最后,我们求得了钦定有 \(i\) 个元素相同的方案数,因为最多有 \(4\) 个元素相同,所以我们直接暴力容斥就行。

code:

for (int x = 1; x <= 4; x++)//一个字符相同的
{memset(tmp,0,sizeof tmp);for (int i = 1; i <= n; i++)tmp[hsh(s[i][x])] ++;for (int i = 0; i <= 6e4; i++)cnt[1] += (tmp[i] * (tmp[i] - 1)) >> 1;
}
for (int x = 1; x <= 4; x++)//两个字符相同
{for (int y = x + 1; y <= 4; y++){memset(tmp,0,sizeof tmp);for (int i = 1; i <= n; i++)tmp[hsh(s[i][x],s[i][y])] ++;for (int i = 0; i <= 6e4; i++)cnt[2] += (tmp[i] * (tmp[i] - 1)) >> 1;}
}
for (int x = 1; x <= 4; x++)//三个字符相同
{for (int y = x + 1; y <= 4; y++){for (int z = y + 1; z <= 4; z++){memset(tmp,0,sizeof tmp);for (int i = 1; i <= n; i++)tmp[hsh(s[i][x],s[i][y],s[i][z])] ++;for (int i = 0; i <= 6e4; i++)cnt[3] += (tmp[i] * (tmp[i] - 1)) >> 1;}}
}
//以下是暴力容斥
ans[3] = cnt[3];
ans[2] = cnt[2] - 3 * ans[3];
ans[1] = cnt[1] - ans[2] * 2 - ans[3] * 3;
ans[0] = ((n * (n - 1)) >> 1) - ans[1] - ans[2] - ans[3];
printf("%lld",ans[4 - d]);//由于求解的是相同的,所以不同的就是4 - d个

例题 for 二项式反演

P10986 [蓝桥杯 2023 国 Python A] 2023

\(f_{m}\) 表示钦定有 \(m\)2023 的方案数。用插板法,在这些 2023 的缝里插入那些乱七八糟的数。在 \(m\)2023 中插入 \(n - 4m\) 个数的方案是

\[f_{m} = \binom{(n - 4m) + (m + 1) - 1}{(n - 4m) - 1} \]

\(g_{m}\) 表示恰好有 \(m\)2023 的方案数,那么有:

\[f_{m} = \sum\limits_{i = m}^{n}\binom{i}{m}g_{i} \]

根据二项式反演公式,我们得到:

\[g_{m} = \sum\limits_{i = m}^{n}(-1)^{i - m}\binom{i}{m}f_{i} \]

那么我们就求得了 \(g_{m}\),就是答案。时间复杂度 \(\mathcal{O}(n)\)

BZOJ2839 集合计数

\(f_{k}\) 表示钦定有 \(k\) 个相同元素的情况,那么,剩下的 \(n - k\) 个元素能够组成 \(2^{n - k}\) 个集合,而,这 \(2^{n - k}\) 个集合又能够再组成 \(2^{2^{n - k}}\) 个集合。那么显然有

\[f_{k} = \binom{n}{k}2^{2^{n - k}} \]

\(g_{k}\) 表示恰好有 \(k\) 个相同元素的情况,那么有:

\[f_{k} = \sum\limits_{i = k}^{n}\binom{i}{k}g_{i} \]

反演一下得到:

\[g_{k} = \sum\limits_{i = k}^{n}(-1)^{i - k}\binom{i}{k}f_{i} \]

我们就得到了 \(g_{k}\)。时间复杂度 \(\mathcal{O}(n)\)

P5505 [JSOI2011] 分特产

首先设 \(f_{i}\) 表示钦定\(i\) 个同学没有拿到特产的方案数,那么有:

\[f_{i} = \binom{n}{i} \times \prod\limits_{j}^{m}\binom{a_{j} + n - i - 1}{n - i - 1} \]

后面那坨表示将 \(a_{j}\) 个物品分成 \(n - i\) 个可空集的方案数,而前面的是因为我们并没有钦定哪几个人没有,所以要乘一个在 \(n\) 个人里面选 \(i\) 个的方案数。

接下来我们开始反演。设 \(g_{i}\) 表示正好有 \(i\) 个人没有,那么有反演公式:

\[g_{i} = \sum\limits_{j = i}^{n}(-1)^{j - i}\binom{j}{i}f_{j} \]

而我们要让每一个人都拿到,答案就是 \(g_{0}\)。这样,我们就做完了。时间复杂度 \(\mathcal{O}(n)\)

BZOJ4665 小 w 的喜糖

依然是正难则反 + 二项式反演 演都不带演

\(f_{i}\) 表示钦定有 \(i\) 个位置相同,\(g_{i}\) 表示正好 \(i\) 个位置相同。那么有反演:

\[f_{i} = \sum\limits_{j = n}^{m}\binom{j}{n}g_{j} \Longleftrightarrow g_{i} = \sum\limits_{j = n}^{m}(-1)^{i - n}\binom{j}{n}f_{j} \]

我们的答案就是 \(g_{0}\)

现在的问题就在于怎么求 \(f_{i}\)。发现初始数组的顺序对于答案来说没有影响,那么我们就记录每种颜色的数量并去重,然后开始 dp。设 \(dp_{i,j}\) 表示循环到第 \(i\) 个颜色,钦定有 \(j\) 个元素相同的方案数。那么有

\[dp_{i,j} = \sum\limits_{k = 0}^{\min(cnt_{i},tmp)}dp_{i - 1,j - k} \times \binom{cnt_{i}}{k} \times \binom{tmp - j}{cnt_{i} - k} \]

初学时属实没想到这玩意还能带 dp

很明显,\(f_{i} = dp_{m,i}\),其中 \(m\) 表示颜色总数。然后我们就得出了答案,时间复杂度为 \(\mathcal{O}(n^2)\)

code:

sort(a + 1,a + n + 1);
int m = unique(a + 1,a + n + 1) - a - 1,tmp = 0;
dp[0][0] = 1;
for (int i = 1; i <= m; i++)
{tmp += cnt[a[i]];for (int j = 0; j <= tmp; j++)for (int k = 0; k <= min(j,cnt[a[i]]); k++)dp[i][j] = (dp[i][j] + dp[i - 1][j - k] * c(tmp - j,cnt[a[i]] - k) % mod * c(cnt[a[i]],k) % mod) % mod;
}
int ans = 0;
for (int i = 0; i <= n; i++)ans = ((ans + (i & 1 ? -1 : 1) * dp[m][i]) % mod + mod) % mod;

好题推荐

P4448 [AHOI2018 初中组] 球球的排列
P3158 [CQOI2011] 放棋子
P3160 [CQOI2012] 局部极小值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865040.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真

1.课题概述 基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介自抗扰控制器(Active Disturbance Rejection Controller, ADRC)结合线性误差反馈控制律(Linear Error Feedback…

MediaWIKI 1.43 教程系列 4 — MediaWIKI 安装后的基本配置

1. 更改logo 将自己的logo 导入到 Mediawiki 的安装目录,即 /var/www/mediawiki/里面的 /resources/assets 然后修改 LocalSettings.php 文件内容,更改如下$wgLogos = [1x => "$wgResourceBasePath/resources/assets/mediawiki.png",icon => "$wgReso…

在iStoreOS上配置frpc客户端

摘自:https://www.koolcenter.com/posts/224 安装frpc,直接在iStoreOS商店找到全部软件。输入名称点新增:填写ip地址以及端口:web 配置看图:

中考英语优秀范文-010 The Spring Festival 春节

1 写作要求 近年来我国的发展世人瞩目,中国的传统文化正越来越受到各国朋友的关注。请根据提示,以 “The Spring Festival” 为题写一篇短文,向外国朋友介绍我国的春节。 要求: 1、字迹工整,规范; 2、 80词左右。 2 优秀范文 The Spring Festival In China, the Spring f…

FANUC机器人M-410iB/700电机断轴维修方法

发那科(FANUC)作为电机领域的领袖品牌,其伺服电机广泛应用于各种工业设备中,特别是在机床、自动化控制、机器人等领域。然而,即使是如此高品质的伺服电机,也难免会出现FANUC工业机械手电机故障,其中断轴故障是比较常见的一种。 一、法兰克机械手电机断轴故障原因分析 1.…

第四章 保护模式入门

本文是对《操作系统真象还原》第四章学习的笔记,欢迎大家一起交流。第四章 保护模式入门 本文是对《操作系统真象还原》第四章学习的笔记,欢迎大家一起交流。 知识部分 为什么要有保护模式? 实模式下安全问题:实模式下操作系统和用户程序属于同一特权级,平起平坐,没有区别…

FMC子卡设计原理图:FMC228-四路1.2Gsps 16bit DA FMC子卡

FMC子卡 , 高性能异构计算卡 , 雷达图像处理 , 模拟信号采集板卡 , 模拟信号输入FMC228-四路1.2Gsps 16bit DA FMC子卡 一、板卡概述FMC228 板卡可实现宽波段、四通道、16位、1.2Gsps(600Msps直接射频综合)DAC功能,时钟可采用内部时钟源(可选择锁定到外部参考),或外部提供…

FMC子卡设计原理图:165-2路万兆光纤SFP+ FMC子卡模块

2路万兆光纤SFP+ FMC子卡模块1. 概述  该板卡是基于kc705和ml605的fmc 10g万兆光纤扩展板设计。  SFP+(10 Gigabit Small Form Factor Pluggable)是一种可热插拔的,独立于通信协议的光学收发器,通常传输光的波长是 850nm, 1310nm 或1550nm,用于10G bps的SONET/SDH,光…

FMC子卡设计方案:127-4通道 12bit 125Msps 直流耦合 AD FMC 子卡

DA输出子卡 , FMC 子卡 , 中低频信号采集 , 模拟信号输入 , FL9627模块4通道 12bit 125Msps 直流耦合 AD FMC 子卡一、板卡概述:FMC 高速 AD 模块 FL9627 为 4 路 125MSPS, 12 位的模拟信号转数字信号模块。 FMC 模块的 AD 转换采用了 2 片 ADI 公司的 AD9627 芯片,每个 AD9…

跨时区协作:娱乐公司团队的全球化利器!

在线文档协作工具如何提升娱乐公司团队的创意效率? 在娱乐行业,创意是核心竞争力。无论是剧本创作、音乐制作,还是影视后期,团队协作的效率直接决定了项目的成败。而在线文档协作工具,正是提升这一效率的利器。今天,我们就从一个具体的点来发散——“实时协作”,看看它如…

tableau连接不上mysql或不显示mysql表的终极解决方法.220301

【报错一】连不上mysql An error occurred while communicating with MySQL The connection to the data source might have been lost. Error Code: 2868C972 The protocol is disconnected! Unable to connect to the MySQL server "*****". Check that the server…

Excel使用IF{1,0}虚拟数组+VLOOKUP实现联合查询.220507

以此案例举例:使用IF({1,0})建立虚拟数据的方法,整体输入的公式是: =VLOOKUP(E2&F2,IF({1,0},A:A&B:B,C:C),2,0) 输入完公式之后,需要按CTRL+shift+enter键 使用if({1,0},A:A&B:B,C:C)来构建了一个不需要辅助列的虚拟数组。 Excel 中ctrl+enter和ctrl+shift+en…