首页 > 其他分享 >并非详细:集合划分容斥的容斥系数

并非详细:集合划分容斥的容斥系数

时间:2024-08-13 17:52:14浏览次数:14  
标签:le dfrac sum 容斥 等价 序列 系数 集合

dp 转移时,我们有时会要求枚举一个极大的合法子集进行转移,但是往往不能很好地处理极大的限制,只能枚举一个不作限制的合法子集。我们希望通过容斥使得每个极大的子集的转移正确。

引用一份看到的形式化描述:在某种等价关系下,对于某一组合结构,构成其的元素其可以被划分成若干等价类,有一关于等价类的系数 \(F(x)\)(即这一等价类的贡献系数)。而我们的 dp 不能恰好地刻画出每一极大等价类(有可能有相互等价的等价类),记等价类之间的合并关系为 \(G(x)\),我们设计容斥系数 \(H(x)\) 满足:

\[G(H(x))=F(x) \]

例:DAG 定向问题

给你一个 \(n\) 个点 \(m\) 条边的无向图,给每条边定向并要求不出现环,求定向方案数。

\(n\le 18\)。

我们知道,这个经典问题的 dp 方法为每一次枚举当前入度为 \(0\) 的极大子集 \(T\) 将其删去。设 \(g_S\) 表示 \(S\) 内的点能否入度为 \(0\),即 \(S\) 是否是独立集,\(f_S\) 表示 \(S\) 内点的定向方案,有:

\[f_S=\sum_{T\sube S} f_{S/T}g_T(-1)^{|T|-1} \]

我们尝试用上述方法得到这个 \((-1)^{|T|-1}\) 的容斥系数:\([x^S]F(x)\) 表示的是极大的入度为 \(0\) 的点集为 \(S\) 时需要贡献的系数,显然 \([x^S]F(x)=[S\ne \varnothing]\)。合并方式为每次加入一个非空无交子集,可以得出 \(G(x)=\dfrac{1}{1-x}-1\)。所以 \(\dfrac{1}{1-H(x)}=F(x)+1\),手动求逆得到 \([x^S]H(x)=(-1)^{|S|-1}\)。

设 \(A(x)=\displaystyle\sum_Sg_S(-1)^{|S|-1}\cdot x^S\),所求即为 \([x^U]\dfrac{1}{1-A(x)}\)。

例:计树

求有多少不同的包含 \(n\) 个点的有标号无根树,满足:对于任何一个点 \(x\),都存在点 \(y\) 使得 \(x\) 和 \(y\) 之间有一条边且 \(|x - y| = 1\)。

\(n\le 10^5\)。

树的形态必定为若干值域连续的链拼起来。

根据 Prufer 定理,\(k\) 个大小分别为 \(w_{1\dots k}\) 的连通块形成树的方案数为:

\[n^{k-2}\prod w_i \]

那么我们每加入一条极长的长为 \(w(w\ge 2)\) 的链将答案乘以 \(nw\),最后除以 \(n^2\)。因为我们不能钦定极长,所以需要容斥。

题目要求链长 \(\ge 2\),那么 \(F(x)=\displaystyle\sum_{i\ge 2}x^i=\frac{x^2}{1-x}\);合并方式与 DAG 定向问题类似,每次直接拼一段上去,\(G(x)=\dfrac{1}{1-x}-1\);简单计算得到 \(H(x)=\dfrac{x^2}{1-x+x^2}\)。

设 \(A(x)=\displaystyle\sum_{w}wn\cdot x^w\cdot[x^w]H(x)\),所求即为 \([x^n]\dfrac{1}{1-A(x)}\)。

例:Yet Another ABC String

给出 \(a,b,c\),求由 \(a\) 个 A,\(b\) 个 B,\(c\) 个 C 构成的字符串数量,使得不存在子串 ABCBCACAB

\(a,b,c\le 10^6\)。

将序列划分为若干极长的形如 ..BCABC...AB... 的连续段。则每个连续段必须 \(\le 2\) 即 \(F(x)=x+x^2\),\(H(x)=1-\dfrac{1}{1+x+x^2}\)。

手玩求逆可以得到:

\[[x^i]H(x)=\begin{cases}-1&i\equiv0\pmod3\\1&i\equiv1\pmod3\\0&i\equiv2\pmod3\end{cases} \]

设 \(A(x,y,z)\) 为一个连续段的生成函数:

\[\begin{aligned}A(x,y,z)&=-3\sum_{i\ge 1}(xyz)^i+(x+y+z)\sum_{i\ge 0}(xyz)^i\\ &=\dfrac{x+y+z-3xyz}{1-xyz} \end{aligned}\]

答案为:

\[[x^ay^bz^c]\dfrac{1}{1-A(x,y,z)} \]

\[[x^ay^bz^c]\dfrac{1-xyz}{1-x-y-z+2xyz} \]

\[\sum_{i\ge 0}(-2)^i\left[\binom{a+b+c-2i}{a-i,b-i,c-i,i}-\binom{a+b+c-2i-3}{a-i-1,b-i-1,c-i-1,i}\right] \]

例:Yet Another Permutation Problem

有一个长为 \(n\) 的排列 \(p\),初始 \(p_i=i\),接下来你需要对它进行若干次操作,每次操作你可以指定一个 \(x\in[1,n]\),将 \(p_x\) 取出后放在排列的开头或末尾。对 \(\forall k\in[0,n)\) 求出经过 \(k\) 次操作能得到几种不同的排列。

\(n\le 1000\)。

判断一个排列是否可行,考虑将操作反过来:将排列的开头或末尾任意插入排列中。不难发现排列合法当且仅当存在一个长度 \(\ge n-k\) 的上升子区间,将该区间外的数依次向内插入即可。

令 \(m=n-k\),不妨计数所有极长上升子区间长度都 \(<m\) 的排列数量。\(F(x)=\dfrac{x-x^m}{1-x}\),\(H(x)=\dfrac{x-x^m}{1-x^m}\)。

令 \(A(x)\) 为一个上升子区间的 EGF,即 \(A(x)=\displaystyle\sum_{i}[x^i]H(x)\cdot \dfrac{x^i}{i!}\),所求即为 \(n![x^n]\dfrac{1}{1-A(x)}\)。注意到 \(A(x)\) 只有 \(O(\dfrac{n}{m})\) 项,所以直接暴力求逆也可做到 \(O(n^2\log n)\)。

例:Distinct Multiples

给定 \(n,m\) 以及一个长为 \(n\) 的序列 \(d_{1\dots n}\),你需要计数有多少个值域为 \([1,m]\) 的序列 \(a_{1\dots n}\) 满足 \(d_i|a_i\) 且 \(a_i\) 两两不同。

\(n\le 16\)。

考虑令等价类为相等的数的集合,则所有极大等价类大小必须都为 \(1\),即 \([x^S]F(x)=[|S|=1]\)。注意此处等价类之间的合并是无序的,则 \(G(x)=\exp x-1\),\(H(x)=\ln\left(F(x)+1\right)\),模拟得 \([x^S]H(x)=(-1)^{|S|-1}(|S|-1)!\)。

令 \(f_S\) 表示等价类 \(S\) 的方案数,\(A(x)=\displaystyle\sum_Sf_S(-1)^{|S|-1}(|S|-1)!\cdot x^S\),所求即为 \([x^U]\exp A(x)\)。

例:A Nameless Counting Problem

给定 \(n,m,x\),求有多少个长为 \(n\) 的单调不降序列 \(a_{1\dots n}\),满足 \(a_n< m\) 且 \(\text{xor}_{i=1}^na_i=x\)。

\(n\le 200\)。

考虑不断将序列中相同的数配对删除,最终得到一个单增的序列。一个长为 \(k\) 的不重序列对应回原序列的方案数为 \([k\equiv n\pmod2]\dfrac{1}{k!}\displaystyle\binom{m+(n-k)/2}{(n-k)/2}\)。

容斥掉互不相同的限制,容斥系数同上题。但此时答案不能简单地由状态的等价类信息得出。设 \(f_{i,j,d}\) 表示长为 \(i\) 的序列,由高至低考虑到第 \(d\) 位,有 \(j\) 个数顶着上界 \(m\) 时满足 \(x\) 这些位的限制的方案数,转移可以枚举这一位有几个数仍顶着上界。

考虑分别有 \(i,j\) 个奇偶大小的等价类,则贡献为 \(m^jf_{i,0,0}\),则设 \(g_{i,j}\) 为目前已经有 \(i\) 个数,有 \(j\) 个奇数大小等价类的贡献和。等价类之间无序,转移时枚举包含 \(1\) 的等价类大小即可。

时间复杂度 \(O(n^3\log v)\),使用生成函数刻画可以得到更优的做法。

例:异或图

给定一个 \(n\) 个点 \(m\) 条边的图以及一个长为 \(n\) 的序列 \(a_{1\dots n}\),有一常数 \(C\),你需要求出有多少序列 \(b_{1\dots n}\) 满足 \(0\le b_i\le a_i\),\(\forall (u,v)\in E,b_u\ne b_v\),\(\text{xor}_{i=1}^nb_i=C\)。

\(n\le 15\)。

考虑 \(m=0\) 怎么做,从高至低枚举第一个不全顶到上界的位 \(d\),则低 \(d-1\) 位只需要一个在第 \(d\) 位不顶到上界的数进行调整,其余数任选即可。

令等价类为相等的数的集合,则 \([x^S]F(x)\) 等于 \(1\) 当且仅当 \(S\) 内点在图上为独立集。\(H(x)=\ln (F(x)+1)\) 可以直接求出。

考虑一个状态的答案,我们只关注每个等价类内部的最小值。每个大小为偶数的等价类均可随便取,大小为奇数的等价类的最小值(称为关键点)构成 \(m=0\) 的子问题。

设 \(f_{S,T}\) 表示当前已经考虑了 \(S\) 内的点,其中关键点的集合为 \(T\) 的方案数,时间复杂度为 \(O(4^n)\)。

此时记录了大量无用信息,我们将 \(a\) 从小到大排序,逐个尝试加入关键点。设当前加入到 \(i\),则 \([1,i)\) 的点已经必然在考虑的点集中,只需要记录它们是否在关键点集中;\([i,n]\) 的点必然不在当前关键点集中,只需要记录它们是否在已考虑点集中。这样状态数就减小至 \(2^n\),再加上枚举子集,时间复杂度为 \(O(3^nn+2^n(m+n\log V))\)。

标签:le,dfrac,sum,容斥,等价,序列,系数,集合
From: https://www.cnblogs.com/cyffff/p/18357432

相关文章

  • 24-08-08 JavaSE Map集合
    24-08-08javaSEMap集合Map接口的特点Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value(双列元素)Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中3.Map中的key不允许重复,原因和HashSet一样,前面分析过源码.Map......
  • 5. MongoDB 集合创建、更新、删除
    1.创建集合1.1语法db.createCollection(name,options)参数说明:name:要创建的集合名称。options:可选参数,指定有关内存大小及索引的选项。options可以是如下参数:参数名类型描述示例值capped布尔值是否创建一个固定大小的集合。truesize数值集合的最大大小(以字......
  • 四数相加2 | LeetCode-454 | 哈希集合 | Java详细注释
    ......
  • Java入门基础16:集合框架1(Collection集合体系、List、Set)
    集合体系结构Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。collection集合体系Collection的常用方法packagecom.itchinajie.d1_collection;importjava.util.ArrayList;importjava.util.HashSet;/**目标:认识Collection体系的特点。*......
  • 线段树水题集合
    用的都是《算法竞赛》的码风哦洛谷P3870极简,开和关用10表示,然后区间修改,区间求和,裸题洛谷P2846这两道题一模一样#include<bits/stdc++.h>usingnamespacestd;constintN=100005;#definelllonglongllls(llp){returnp<<1;}llrs(llp){returnp<<1|1;}lln......
  • windows C++-使用 C++/WinRT 的集合
    在内部,Windows运行时集合具有大量复杂的移动部件。但要将集合对象传递到Windows运行时函数,或要实现自己的集合属性和集合类型时,C++/WinRT中有函数和基类可以提供支持。这些功能消除复杂性,并节省大量时间和精力上的开销。IVector是由元素的任意随机访问集合实现的Windo......
  • lg容斥与反演
    容斥与反演容斥之前从没有搞清楚的:容斥是一种方法,为了做到不重复计数,先算总和再去除重复的方法。所以我们可以计算任意具备一种性质的元素个数(并),通过计算“至少具备了某些元素的个数”(交)。另一种形式:总数-不满足所有性质的元素=任意满足一种性质的元素此时,不满足所有性质即......
  • 基于 JavaFx 搭建的实用小工具集合
    大家好,我是Java陈序员。作为一名后端程序员,常常需要在电脑上安装各种工具软件来支持日常开发。那么,是否有一款工具集合,包含各种工具,可以省去一一安装呢?答案是有的!今天,给大家介绍一个基于JavaFx实现的工具集合,包含了各式各样的开发工具,以及一些有趣的小工具。关注微信公众......
  • LinkedList模拟栈数据结构的集合,并测试
    packagecom.shujia.day13;importjava.util.LinkedList;/*LinkedList请用LinkedList模拟栈数据结构的集合,并测试栈:先进后出题目的要求是:自己创建一个类,将LinkedList作为成员变量,将来创建自己的类对象,使用自己的方法,但是底层用的是LinkedList中的方法......
  • ArrayList集合及例题 day12
    packagecom.shujia.day13;importjava.util.ArrayList;importjava.util.Iterator;/*Collection:-List(有序【指的是存储和取出的顺序是一致的】且可以发生重复,且有索引的概念)-ArrayList:底层数据结构是数组,查询快,增删慢,线程不安......