首页 > 其他分享 >二项式反演和 Min-Max 反演小记

二项式反演和 Min-Max 反演小记

时间:2023-07-02 18:33:07浏览次数:36  
标签:Min Max sum 反演 varnothing binom subseteq operatorname

二项式反演

本质上是某种容斥。

结论为:

\[f_i = \sum_{j=0}^i(-1)^j\binom{i}{j}g_j\Leftrightarrow g_i = \sum_{j=0}^i(-1)^j\binom{i}{j}f_j \]

更常用的形式是

\[f_i = \sum_{j=0}^i \binom{i}{j}g_j\Leftrightarrow g_i = \sum_{j=0}^i(-1)^{i-j}\binom{i}{j}f_j \]

证明第二个式子(EGF 证法):

记 \(f\) 的指数生成函数为 \(F(x)\),\(g\) 的指数生成函数为 \(G(x)\)。
那么

\[\begin{split} &F(x) = \mathrm{e}^{x}G(x)\\ &G(x) = \mathrm{e}^{-x}F(x)\\ &g_i =i!\sum_{j=0}^i\frac{(-1)^{i-j}}{(i-j)!}\frac1{j!}f_j=\sum_{j=0}^i(-1)^{i-j}\binom{i}{j}f_j\\ &\Box \end{split} \]

实际上还有一种形式:

\[f_i = \sum_{j=i}(-1)^j\binom{j}{i}g_j\Leftrightarrow g_i = \sum_{j=i}(-1)^j\binom{j}{i}f_j \]

或者写成:

\[f_i = \sum_{j=i}\binom{j}{i}g_j\Leftrightarrow g_i = \sum_{j=i}(-1)^{i-j}\binom{j}{i}f_j \]


错排问题

长度为 \(n\) 的排列 \(p\) 若对于 \(1\le i\le n\) 满足 \(i\not= p_i\),称它为一个错位排列。

将长度为 \(n\) 的错位排列数记为 \(D_n\)。

需要快速地求出某一 \(D_n\)。


对于所有长度为 \(n\) 的排列 \(p\),有 \(k\) 个 \(i\) 满足 \(p_i\not= i\) 的排列 \(p\) 的个数为 \(\binom{n}{k}D_k\)。

考虑枚举 \(k\) 即有:

\[n! = \sum_{i=0}^n\binom{n}{k}D_k \]

套用反演结论即有

\[D_n = \sum_{i=0}^n(-1)^{n-i}\binom{n}{k}k!=n!\sum_{i=0}^n(-1)^{i}\frac1{i!} \]


QOJ#5826 GDKOI2023TG D1T2

求有几个长度为 \(n\) 的排列 \(p\) 满足 \(\forall 1\le i\le m, p_i>m\) 且 \(\forall 1\le i\le n, p_i\not=i\), \(\operatorname{mod} 998244353\)。


不会正解,推个基本的式子。

考虑先在 \([m+1, n]\) 点 \(m\) 个数填在前 \(m\) 个位置上,然后将剩下除 \([1, m]\) 的 \(n-2m\) 个数填掉,最后把 \([1, m]\) 直接填进去。

发现第一步会有一个 \(\frac{(n-m)!}{(n-2m)!}\) 的系数,第三步会有一个 \(m!\) 的系数,把这两步系数的乘积记为 \(k\),而第二步的系数不太好计算,类似于原版错排问题。

枚举第二步中 \(p_i=i\) 的位置的个数:

\[k\binom{n-m}{n-2m}=\sum_{i=0}^{n-2m}\binom{n-2m}{i}f_i \]

令 \(l = n-2m\),那么

\[k\binom{l+m}{l}=\sum_{i=0}^{l}\binom{l}{i}f_i \]

反演得

\[f_l = k\sum_{i=0}^l(-1)^{l - i}\binom{l}{i}\binom{i+m}{i} \]


BZOJ3622 已经没什么好害怕的了

给定两个长度为 \(n\) 的序列 \(a,b\),将 \(a\) 与 \(b\) 两两配对,求 \(a\) 比 \(b\) 大的组恰好有 \(k\) 个的方案数。

\(n\le 2000\)


容斥dp

恰有 \(k\) 组不太好求,考虑用容斥变为钦定 \(k\) 组,其余随意。

用 \(g_i\) 表示恰有 \(i\) 组的方案数,\(f_i\) 表示钦定 \(i\) 组的方案数,那么:

\[f_k(n-k)! = \sum_{i=k}^n\binom{i}{k}g_i \]

这个式子珂能不太好理解,左边的意思是钦定 \(k\) 对,其余任选;右边的意思是对于每个 \(i\ge k\) 都可以点 \(k\) 组来钦定,因此这个式子是正确的。

这个式子可以直接套另一种二项式反演。

\[f_k(n-k)! = \sum_{i=k}^n\binom{i}{k}g_i \]

考虑将 \(f\) 数组 dp 出来:

\(f_{i,j}\) 表示当前 dp 到 \(i\),已经钦定了 \(j\) 对的方案数。

我们将 \(a, b\) 分别降序排序,方便 dp。

用 \(mx_i\) 表示 \(a_i\) 可以匹配的数的个数,那么可以轻易写出状态转移方程:

\[f_{i, j}=f_{i-1, j} + (mx_i-j+1)f_{i-1, j-1} \]

时间复杂度 \(\mathcal{O(n^2)}\)。


Min-Max 反演

首先由二项式定理可以得到一个式子

\[\sum_{T\subseteq S}(-1)^{|T|} = [S=\varnothing] \]

这个式子是好证明的:

\[\sum_{T\subseteq S}(-1)^{|T|} = \sum_{i=0}^{|S|}\binom{|S|}{i}(-1)^i = (1-1)^{|S|} = [S = \varnothing] \]

Min-Max 反演的结论式为:

\[\max S = \sum_{T\subseteq S \land T \not= \varnothing} (-1)^{|T| - 1}\min T\\ \min S = \sum_{T\subseteq S \land T \not= \varnothing} (-1)^{|T| - 1}\max T \]

证明第一个式子,第二个式子的证明是类似的

\[\begin{split} &\max S \\ =&\sum_{x\in S}x[\{y|y>x\} = \varnothing]\\ =&\sum_{x\in S}x\sum_{T\subseteq\{y|y>x\}}(-1)^{|T|}\\ =&\sum_{T\in S \land T \not= \varnothing} (-1)^{|T| - 1}\min T \end{split} \]

期望形式同样成立:

\[E(\max S) = \sum_{T\subseteq S \land T \not= \varnothing} (-1)^{|T| - 1}E(\min T)\\ E(\min S) = \sum_{T\subseteq S \land T \not= \varnothing} (-1)^{|T| - 1}E(\max T) \]


Luogu P3175 [HAOI2015] 按位或

考虑对于每一位分别考虑,答案就是每一位第一次出现的时间的最大值。

最大值是不好处理的,使用 Min-Max 反演转化成最小值。

\(\min S = \dfrac1{\sum_{T\cap S\not ={\varnothing}}p_{T}}\)

发现交不为空实际上就是状压后位与起来不等于 \(0\),这个不好求,考虑求出位与起来等于 \(0\) 的和减一下就好了,位与起来为 \(0\) 也就是将 \(S\) 取反后 \(T\) 为 \(S\) 的子集,直接高维前缀和即可。


还有一道很神的题,这里是题解: Luogu P5643 [PKUWC2018]随机游走


Min-Max 反演推广——Kth Min-Max 反演

如何将一个集合中的第 \(k\) 大转化成子集 \(\min\) 呢?

发现 Min-Max 中用的结论是

\[\sum_{T\subseteq S}(-1)^{|T|} = [S=\varnothing] \]

如果找到函数 \(f(x)\) 使得 \( \sum_{T\subseteq S}f(|T|) = [|S|=k-1]\),就可以得出 Kth Min-Max 反演的式子。

我推的柿子:

\[\begin{split} &\sum_{T\subseteq S}f(|T|) = [|S|=k-1]\\ &\sum_{i=0}^{|S|}\binom{|S|}{i}f(i) = [|S|=k-1] \end{split} \]

二项式反演得

\[f(x) = \sum_{i=0}^x(-1)^{x-i}\binom{x}{i}[i=k-1]=(-1)^{x-k+1}\binom{x}{k-1} \]

于是可以写出 Kth Min-Max 反演的式子:

\[\operatorname{kth-max}S=\sum_{T\subseteq S\land T\not ={\varnothing}}(-1)^{|T|-k}\binom{|T|-1}{k-1}\min T\\ \operatorname{kth-min}S=\sum_{T\subseteq S\land T\not ={\varnothing}}(-1)^{|T|-k}\binom{|T|-1}{k-1}\max T \]

期望形式同样成立。


Luogu P4707 重返现世

首先用 Kth Min-Max 反演:

\[E(\operatorname{kth-max}S) = \sum_{T\subseteq S\land T\not ={\varnothing}}(-1)^{|T|-k}\binom{|T|-1}{k-1}E(\min T)\\ \]

注意到此处的 \(k\) 和题面中意义不同,实际上是 \(n-k+1\),所以非常小。

若用 \(\operatorname{sum}{S}\) 表示集合 \(S\) 中所有元素的和,则 \(E(\min T) = \dfrac m{\operatorname{sum}T}\),此处两个 \(T\) 第一个是表示第一次出现的时间集合,第二个是表示出现概率 \(p_i\) 的集合。

于是柿子变为:

\[E(\operatorname{kth-max}S) = (-1)^k\sum_{T\subseteq S\land T\not ={\varnothing}}(-1)^{|T|}\binom{|T|-1}{k-1}\dfrac m{\operatorname{sum}T}\\ \]

考虑 dp 求出这个和式。

可以对于所有的 \(|T|\) 和 \(\operatorname{sum}T\) 求出其方案数,这样就可以计算了。这个是好容易用 dp 解决的,一个一个数考虑加不加入即可,但这样的时间复杂度是 \(\mathcal{O}(n^2m)\) 的,且没有用到 \(k\) 特别小的条件。

考虑减少状态,发现 \(\operatorname{sum}T\) 不好消去,只能把 \(|T|\) 这一维消去。

那么需要对于每个 \(j = \operatorname{sum}T\) 求出

\[\sum_{\operatorname{sum}T=j} (-1)^{|T|}\binom{|T|-1}{k-1} \]

考虑加入一个数时(也就是 \(|T|\) 增加 \(1\) 时)这个柿子会发生什么变化,可以发现 \((-1)^{|T|}\) 会取反且 \(\binom{|T|-1}{k-1}\) 会变成 \(\binom{|T|}{k-1}\),这个二项式系数发生了什么变化呢,观察到 \(\binom{|T|}{k-1} = \binom{|T|-1}{k-1} + \binom{|T|-1}{k-2}\),于是可以在 dp 中记录 \(k\) 这一维进行递推。

\(f_{i, j, d}\) 表示当前 dp 到 \(i\) 时的 \(\sum\limits_{\operatorname{sum}T=j} (-1)^{|T|}\binom{|T|-1}{d}\),那么可以写出状态转移方程:

\[\begin{split} f_{i, j, d} &\gets f_{i-1, j, d}\\ f_{i, j, d} &\gets -(f_{i-1, j-p_i, d} + f_{i-1, j-p_i, d-1}) \end{split} \]

这样做时间复杂度是 \(\mathcal{O}(nmk)\),空间上可以将第一维滚掉。

\[\mathcal{-END-} \]

标签:Min,Max,sum,反演,varnothing,binom,subseteq,operatorname
From: https://www.cnblogs.com/0922-Blog/p/binom_and_minmax.html

相关文章

  • maxscript pathConfig.appendPath 的 bug
    pathConfig.appendPath可以很方便的把2个路径Combine在一起不管你后面带不带斜杠pathConfig.appendPath@"C:\try"@"kle.jpg""C:\try\kle.jpg"pathConfig.appendPath@"C:\try"@"kle.jpg""C:\try\kle.jpg"很酷,然后path......
  • atx-agent学习(2)-安装minitouch的过程
    minitouch是帮助模拟手机触摸的工具,atx-agent不安装它也可以.首先,确定minitouch的下载地址,如下面地址所示:'https://github.com/openatx/stf-binaries/raw/0.3.0/node_modules/@devicefarmer/minitouch-prebuilt/prebuilt/arm64-v8a/bin/minitouch'不过这里面arm64-v8a......
  • MacOS M1 环境下的 Nginx + docker php-fpm7.4 部署fastadmin
    DokerfileFROMphp:7.4-fpm#php版本低于8的话安装swoole建议指定版本RUNapt-getupdate&&apt-getinstall-y\libfreetype6-dev\libjpeg62-turbo-dev\libpng-dev\libzip-dev\libssl-dev\git\unzip\&&do......
  • 18、【SparkStreaming】object not serializable (class: org.apache.kafka.clients.c
    背景:当SparkStream连接kafka,消费数据时,报错:objectnotserializable(class:org.apache.kafka.clients.consumer.ConsumerRecord,value:ConsumerRecord分析:消费者的消费记录序列化出现了问题,需要正确的进行序列化。措施:在设置sparkconf的时候,指定序列化方式就可以解......
  • Taurus .Net Core 微服务开源框架:Admin 插件【4-3】 - 配置管理-Mvc【Plugin-MicroSer
    前言:继上篇:Taurus.NetCore微服务开源框架:Admin插件【4-2】-配置管理-Mvc【含请求日志打印】本篇继续介绍下一个内容:1、系统配置节点:Mvc- Plugin- MicroService 配置界面:注册中心 界面如下:简要说明:该菜单下,显示该微服务类型的菜单,可能为服务端、或客户端、或两......
  • MinIO-对象存储简单使用
    MinIO1.基础概念Object:存储到minio的基本对象,如文件,字节流,Anything...Bucket:用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。对于客户端而言,就相当于一个存放文件的顶层文件夹。Driver:即存储数据的磁盘,在minio启动时,以参数的方式传入。MinIO中所有的对象都......
  • 1699H - Maximal And
    思路:0.只有所有数这一位是1&结果才为11.想要得出最大值,高位越大越好所以从高位开始操作2.记录所有数字的每位为1的cnt[位数]++然后那位需要操作的次数为n-cnt[位数]3.优先执行:操作数给高位如果操作数不够使高位&后结果改变则给可以被改变的最高位4.终止条件:操作......
  • Mininet教程
    mininet的安装1.前言1、本次安装环境为ubuntu20.04。2、mininet为github上的最新版,我已经修改镜像地址并克隆到了gitee,只需要从我的gitee仓库克隆即可。3、mininet安装中需要自动使用apt安装额外依赖,为了确保稳定性,需要对ubuntu进行换源(按照ubuntu教程即可)。2.克隆minine......
  • Japanese Student Championship 2021 F Max Matrix
    洛谷传送门AtCoder传送门我们考虑动态维护答案。如果已经知道上一步的答案,考虑计算这一次操作之后答案的变化。考虑现在有一个数列\(a_{1\simn}\),我们想知道\(\sum\limits_{i=1}^n\max(x,a_i)\)。计算出\(c=\sum\limits_{i=1}^n[a_i<x],s=\sum\limits_{i......
  • minio的使用
    文章目录官网简介下载搭建修改用户名密码使用通过java调接口,,直接官网上面引入对应jar:集群模式,多磁盘官网minio官网https://min.io中文镜像网站:http://minio.org.cn/有时候中文镜像网站是404,所以下载走中文镜像网站,文档走官网好了.简介MinIO是一个基于ApacheLicensev2......