首页 > 其他分享 >lg容斥与反演

lg容斥与反演

时间:2024-08-12 11:49:41浏览次数:7  
标签:lg 前缀 sum 容斥 反演 子集 choose

容斥与反演

容斥

之前从没有搞清楚的:

容斥是一种方法,为了做到不重复计数,先算总和再去除重复的方法。


所以我们可以计算任意具备一种性质的元素个数(并),通过计算“至少具备了某些元素的个数”(交)。

另一种形式:总数-不满足所有性质的元素=任意满足一种性质的元素

此时,不满足所有性质即可表示为 \(\sum_S(-1)^{n-|S|}P(S)\) 其中 P(S) 表示满足 S 中所有性质的个数。

  • 小星星 [ZJOI2016]:

  • 朴素 dp:令 \(f(i,j,S)\to\) [int:子树i,int:i映射到j,set:子树中的对应编号集合|的方案数]

  • 考虑优化,寻找 dp 重复做了什么,哪些限制会导致复杂度高,可不可以不做

  • 由于我们要避免重复映射,所以要存储子集。

  • 所以考虑容斥解决这个问题

  • 恰好不好满足,就可以转化为至少至多


  1. \(=\) 或 \(\neq\)

  2. \(\min\) 或 \(\max\)

  3. 至少或至多

  4. 其他限制难以计算的时候


例子:用这个把他变成别的条件!

那么我们就希望,存在 \(f_i\):

\[\sum_{i=0}^m{m\choose i}f_i=a_m \]

那么可以递推求 \(f\),则答案:

\[ans=\sum_{i=0}{n\choose i}(n-i)!f_i \]

反演

  • 本质

二项式反演

\[\begin{align} &g_n=\sum_{i=0}^n{n\choose i}f_i\\ \iff&f_n=\sum_{i=0}^n{n\choose i}(-1)^{n-i}g_i \end{align} \]

  • 再探错排

令 \(g_n\) 表示所有人随便站,\(f_n\) 表示恰好 \(n\) 个人站错的方案数。

那么 \(g,f\) 满足上述 \((1)\) 式。可惜我们要求 \(f_n\) 。

  • 证明 (vfk)

考虑这个

\[f_n=\sum_{m=0}^n[n-m=0{n\choose m}f_m \]

正确性显然

\[\sum_{k=0}^n(-1)^k{n\choose k}=[n=0] \]

使用二项式定理展开 \((1-1)^n\) 可得,并代入

最后一个式子后面的求和即为 \(g\)

  • 其他形式

常用限制放缩方法。比起容斥,这时我们不必推导容斥系数。

  • P4859已经没有什么好害怕的了:

放松限制,允许有一定重复,这样就不错了。

子集反演

  • 高维前缀和/子集和

实际上认为每一个二进制数的位是一个维度,取值0/1,即有 n 个维度的前缀和

  • 一维前缀和:扫一遍

  • 二维前缀和:先扫x再扫y

  • 高维前缀和:一维一维扫


\[\begin{align} &F[S]=\sum_{T\subset S}G[T]\\ \iff&G[S]=\sum_{T\subset S}(-1)^{|S|-|T|}F[T] \end{align} \]

组合意义:若 F 是 G 的高维前缀和,则 G 是 F 的高维差分。


  • kosare

  • Ribbons on Tree

min-max 反演

\[\max\{S\}=\sum_{T\subset S}(-1)^{|T|+1}\min\{T\} \]

\[\operatorname{kthmax}(S)=\sum_{T\subset S}(-1)^{|T|-k}{|T|-1\choose k-1}\min(T) \]


  • 按位或:考虑时间问题使用 \(\text{min-max}\) 容斥。将最大的时间戳变成最小的。

    只需高维前缀和。

斯特林反演

\[\def\stira#1#2{\begin{bmatrix}#1\\ #2\end{bmatrix}} \def\stirb#1#2{\begin{Bmatrix}#1\\ #2\end{Bmatrix}} \]


  • 方阵

只有行列其中一个的限制很容易,考虑用这个计算答案。看作分成若干等价类,则存在Stirling 反演的式子。

  • *异或图

容斥/反演掉连通图限制。即考虑 总共-不连通 \(\iff\) 总共-多个连通块的

可枚举子集划分,每个子集随便连,这样就有若干连通块(大于等于子集划分个数的方案数)。

这就是至少的意义:

标签:lg,前缀,sum,容斥,反演,子集,choose
From: https://www.cnblogs.com/haozexu/p/18354676

相关文章

  • 记录JSch连接SFTP Exception:Algorithm negotiation fail问题解决
    问题描述:关于正式环境访问外网连接不成功 1、首先检查是否开放防火墙(已确认开放),策略开放后,通过命令连接是否畅通: 通过telnet命令,可以得出,访问畅通。telnet192.168.1.122 2、查看生产环境日志,观察生产环境访问外网服务器异常:抛出异常,提示:算法协商失败com.jcraft.j......
  • Linux 下利用 Valgrind 进行内存调试
    目录一、概述二、Valgrind的使用1、基本格式2、Valgrind工具集3、Memcheck3.1使用未初始化的内存3.2内存泄漏3.3在内存被释放后进行读/写3.4内存块的尾部进行读/写4、常见错误三、分析内存泄漏的使用技巧1、Valgrind协调GDB工作2、利用/proc定位问题3、使用......
  • COMPSCI 753 Algorithms for Massive Data
    COMPSCI753AlgorithmsforMassiveDataAssignment1/Semester2,2024GraphMiningGeneralinstructionsanddataThisassignmentaimsatexploringthePageRankalgorithmonbigreal-worldnetworkdata.Byworkingonthisassignment,youwilllearn......
  • lg-dp3
    lg-dp3计数的东西有什么特点、转化/好的刻画方式AFarthestCity题面关键信息:权值为1的最短路---bfs---分层那么显然加一个点他只能与上一层连,和一层内部连。则设\(f_{i,j}\)为[点数,最后一层点数]有\[f_{i,j}=2^{j\choose2}\sum_{k=1}^{i-j}{f_{i-j,k}(2^k-1)^j{n......
  • lg组合计数
    组合计数关于记号\[C_n^m={n\choosem}=A_n^m/m!=n^{\underline{m}}/m!\]插板法插板法:分集合问题\(\iff\)不定方程正整数解计数问题\[{n-1\choosem-1}\]创造条件法(构造双射),即,构造元素集合\(A,B\),以及一个\(A,B\)之间的双射\(f\),则把计数\(A\)变成计数\(B\)。......
  • C++ Rect And Point Search Algorithm
    测试 ////Createdbywwwon2024/8/8.//#include"include/cxstructs.h"#include"include/cxml/k-NN.h"//可扩展Rect内搜索子Rect或PointvoidtestRectSearch(){usingnamespacecxstructs;std::random_devicerd;std::mt19937gen(rd()......
  • lg-dp1
    记忆化搜索:记忆化压缩DP状态(一些期望dp里会用)剪枝递推:保证前面的部分已经计算了数位dp求\([l,r]\)之内满足某种限制的数的个数,该限制应该是与数位有关系的。带不带前导0取决于是否对统计答案造成影响。前缀和转化:只有上界补充题:如果lim=1的时候前面都......
  • ImportError:无法从“jwt.algorithms”导入名称“RSAAlgorithm”
    RSAAlgorithmPyJWT算法方法无法导入,但我确实安装了PyJWT错误:ImportError:cannotimportname'RSAAlgorithm'from'jwt.algorithms'我通过运行以下命令检查了该包是否可用:poetryshow|grep-ipyjwtpyjwt2.9.0J......
  • min-max 容斥
    前置知识请牢记二项式定理:\((a+b)^n=\sum\limits_{i=0}^{n}{\dbinom{n}{i}a^{n-i}b^i}\)或另外一种形式:\((a+1)^n=\sum\limits_{i=0}^{n}{\dbinom{n}{i}a^{n-i}}\)min-max容斥min-max容斥的主要思想是给每个子集分配一个系数(然后每个属于子集的\(a_i\)的系数加上该......
  • valgrind简介
    0预备工作sudoapt-getupdatesudoapt-getinstallvalgrind编译debug版本gcc-g-oyour_programyour_program.cset(CMAKE_BUILD_TYPEDebug)1定位内存泄露Valgrind最著名的工具是memcheck,它用于内存错误的检测,执行如下代码进行进行内存泄漏检测valgrind--le......