首页 > 其他分享 >计数题总结

计数题总结

时间:2024-08-16 21:17:03浏览次数:13  
标签:总结 le 反演 sum det 计数 choose

实在有必要单独拿出来说说,我一直认为我的计数能力相较其他能力是较突出的,但是最近做到的题目让我不得不怀疑我到底会不会做计数题。做计数时还是只能靠灵光一现吗?那这样的题目叫我怎么灵光一现?

所以有必要好好总结计数题的常见技巧。当然因为样本量有限,所以可能会漏掉某些重要的技巧。

从 2024 年 07 月开始,遇到计数题目就会尝试更新本文。

上次更新是 2024年 08 月。

等价关系

如果遇到一个看起来就很难在合法的时间复杂度内通过的限制,那么首先要做的就是找到原题目限制的等价条件「AHOI2022」山河重整 是典型例子之一,原题目的条件似乎只能二维记录,但是直觉上来说这个条件感觉不满足的情况也比较单一。尝试 \(O(n^2)\) 的 DP 时可以发现等价条件,那么就可以针对不满足的情况容斥就好了。

另一个找等价条件的题目是 「2021 集训队互测」这是一道集训队胡策题。等价条件的妙用是解决这个题目的关键,发现满足原本的条件当且仅当 \(\sum_{i,j} ([a_i=c_{i,j}]+[b_j=c_{i,j}]-[a_i=b_j])=n^2\) 且其他情况一定有小于关系,于是只需要考虑取最大值的个数即可。

因此寻找等价条件的原则应该是让问题更可做。

而等价条件的寻找就要因题而异了,一般来说是对于某个模型或者某种特殊的性质有固定的处理思路,在这些处理上找到题目限制带来的特殊性。

唯一表示/最小表示

如果在条件的限制之下某几种类似的情况只会被计入一次,那么就考虑使用一种唯一的表示方法,比如最小表示,字典序最小,和最小,第一次出现的时候统计等等,因题目而异。

映射(双射)关系

一个问题的方案,可以通过构造或者映射的方式一一对应另一个问题的方案,或者互不相交地拆成几个不同的情况,或者相交的部分可以容斥掉。

典型的例子是通过 dp 的值反推原本的值。

比如如果有 \(f(i,j)=\max\{f(i-1,j),f(i,j-1)\}+a_{i,j}\),那么就可以通过 \(f(i,j)\) 反推出 \(a\),对 \(f\) 计数就可以等效于对 \(a\) 计数,而且 \(f\) 一定满足 \(f(i,j)\le f(i+1,j),f(i,j+1)\) 这一良好的性质。

对应的题目是 QOJ #2568. Mountains,是 LGV 引理的经典问题。以及加强版 QOJ #3082. Ascending Matrix 使用插值求出答案。

而且其实很多定理的证明也用到了双射的原理。

就拿 LGV 引理举例子。

针对不同情形的通常处理

对序列个数计数

如果条件只限制在相邻元素之间,那么就可以考虑通过插入并维护状态的方式来计数,通常来说就成了连续段 dp 的板子题目。

但是会存在一些限制,不能轻易地在 dp 上表示。这时可以考虑插入的顺序是否有特殊的地方。

比如 「2020-2021 集训队作业」Tour 此题(\(a_i\ge 0\) 的情况),通过合适的顺序选取,可以使得 \(x\) 被插入时未被插入的元素要么全部能插入在它的旁边、要么全部都不能插在它的旁边。那么对空位计数就可以了。

如果条件没有限制在相邻元素之间,那么如果没有转化成其他类型的问题,那么通常就需要 dp 来解决了。

有时还会考虑单调队列、单调栈等。

对树的个数计数

通常是矩阵树定理吧,但是偶尔会有记录连通块个数和一些信息的 dp 存在,其他情况就只能说是因题而异了(汗)。

棋盘问题

首先应该考虑横纵坐标能否分离。

如果不能将横坐标和纵坐标分离,那么可能思路就会比较有限了。此时就应该考虑棋盘的性质,比如满足相邻连边后为二分图,或者是平面图,以及诸如此类的性质。

计数方式的优化和技巧

动态规划

设计状态

有些时候合理的状态设计可以优化掉很多时间,最简单的比如如果 \(f(i,j,k)\) 中只会用到 \(k-j\),那么就没必要记录 \(f(i,j,k)\) 而可以只记录 \(f(i,t=k-j)\) 就可以了。更多的例子因题而异

后置计数过程

有时如果说在每个时刻都要要求 \(f(i,\cdots)\) 的值就等于当前状态下的方案数,那么状态数会特别复杂。或者某个时候我们需要直到后续的状态来计算这个位置的贡献,这时会很头痛(当然也可以使用下面的钦定后续来做)。但是如果能够在某个时刻我们再进行“清算”,一般这个时候会比较特殊,可以通过较少的几个状态的值推出方案数,就可以得到较少状态的 dp 转移方程。值得一提的是,如果这个“清算时刻”的量级比通常转移的量级小,那么在这个时刻,我们还可以支持更高时间复杂度的计算和转移。

钦定后续(未来形 dp)

如果依次转移的 dp 计数时会受到后续的影响,可以钦定后续的状态为确定值,在转移途中通过一个个确定的位置对这个值进行回溯,合法的情况最终会回溯到一个合法的初始值(所有不合法的初始值都不能回溯到初始值,否则就要容斥了)。


矩阵树定理

\(D\) 为度数矩阵,\(A\) 为邻接矩阵,\(M_i\) 为 \(D-A\) 去掉第 \(i\) 行第 \(i\) 列的矩阵,记原图生成树个数为 \(C\)。则有:

\[C=\det M_1=\det M_2=\cdots=\det M_n \]

某引理优化矩阵树定理

考虑矩阵 \(A\) 可逆时有以下等式:

\[\left[ \begin{matrix} I & 0 \\ V^T & I \end{matrix}\right] \left[ \begin{matrix} A+UV^T & U \\ 0 & I \end{matrix}\right] \left[ \begin{matrix} I & 0 \\ -V^T & I \end{matrix}\right] = \left[ \begin{matrix} A & u \\ 0 & I + V^TA^{-1}U \end{matrix}\right] \]

因此得到 \(A\) 可逆时有 \(\det (A+UV^T)=\det A\det (I+V^TA^{-1}U)\) 成立。

那么放在矩阵数定理上容易度数矩阵 \(D\) 和邻接矩阵 \(A\) ,想到如果可以将 \(A\) 表示成 \(UV^T\),则有 \(\det (D-A)=\det D\det(I-V^TD^{-1}U)\) 成立。

构造更小的 \(U,V\),尝试缩小 \(V^T D^{-1} U\) 即可。

经典题目:AGC060F


LGV 引理(平面图前提下的组合意义)

如果有 \(n\) 个起点和 \(n\) 个终点各自排成一列为 \(s_i\) 和 \(t_i\),且整张图为一个有向无环图。

构造矩阵 \(M\) 使得 \(M_{ij}=w(s_i,t_j)\),其中 \(w(s_i,t_j)\) 表示所有从 \(s_i\) 出发到达 \(t_j\) 的路径上边权乘积之和。

如果原图为平面图,有 \(n\) 条路径 \((s_i\to t_i)\),每条路径之间没有交,称这个路径组合法,且权值为这些路径上所有边的乘积。\(\det M\) 应该为所有合法路径组的权值之和。

如果不是平面图,则是一个没什么用的图论中的计数意义。


容斥

转移中容斥

这种方式一般会对应较为巧妙的计数题目。比如要求一个位置要么满足 \(A\) 性质,要么满足 \(B\) 性质,那么转移中可以钦定该位置满足 \(A\) ,并转移;钦定该位置满足 \(B\),并转移。但是发现从这里转移出去的情况中可能会有该位置既满足 \(A\) 又满足 \(B\) 的情况,这时可以钦定该位置同时满足两个性质并转移 \(-2\) 倍。

更多的性质也是同理。

最终清算时容斥

就是最经典的容斥了。很多计数题目都有用。

实际上是反演的容斥

会放在反演类中单独提到。


反演

二项式反演

\[f(n)=\sum_{m\le n} {n\choose m} F(m)\Leftrightarrow F(m) = \sum_{n\le m} (-1)^{m+n} {m\choose n} f(n) \]

通常运用于满足以下条件的情况:个体之间独立存在是否满足条件的要求,即一个个体是否满足条件不会影响其他个体是否满足;任意相同个数的个体集合全部满足条件的方案数相等;任意相同个数的个体集合全部不满足条件的方案数 仅有 1 种。比如 \(F(m)\) 的意义是只考虑 \(m\) 个个体,且这 \(m\) 个个体均满足条件的方案数,\(f(n)\) 的意义是只考虑 \(n\) 个个体,不对于这 \(n\) 个个体作其他要求时的方案数。那么显然有 \(f(n)=\sum_{m=0}^n {n\choose m} F(m)\),反演可得 \(F(m)=\sum_{n=0}^m{m\choose n} (-1)^{n+m} f(n)\),通常来说 \(f(n)\) 是好求的。

那么问题来了,现在我认为这样一个条件太局限了,显得整个反演很菜,感觉没什么用:“任意相同个数的个体集合全部不满足条件的方案数 仅有 1 种”。假如我认为,一个个体有两种方式不满足条件,也就是说 \(n\) 个个体构成的集合全部不满足条件的方案有 \(2^n\) 种时,二项式反演能否继续给力?实际上是可以的:

\[f(n)=\sum_{m\le n} {n\choose m} F(m)\times 2^{n-m} \\ \Rightarrow\frac{f(n)}{2^n}=\sum_{m\le n} {n\choose m} \frac{F(m)}{2^m} \]

这样就皆大欢喜了,把 \(\frac{f(n)}{2^n}\) 和 \(\frac{F(m)}{2^m}\) 当作新的 \(f(n)\) 和 \(F(m)\) 即可。

另外还有三个二项式反演的变体,四者是类似的:

\[f(n)=\sum_{m\le n}(-1)^m {n\choose m} F(m) \Leftrightarrow F(m)=\sum_{n\le m} (-1)^n {m\choose n} f(n) \\ f(x)=\sum_{x\le i\le n} (-1)^{i} {i\choose x} F(i) \Leftrightarrow F(x) = \sum_{x\le i\le n}(-1)^{i}{i\choose x} f(i) \\ f(x)=\sum_{x\le i\le n} {i\choose x} F(i) \Leftrightarrow F(x) = \sum_{x\le i\le n}(-1)^{x+i}{i\choose x} f(i) \]

多项式科技优化二项式反演

对于 \(f(x)\) 和 \(F(x)\),设满足 \(f(n)=\sum_{m\le n} {n\choose m} F(m)\)。

则应该有:

\[\begin{aligned} &F(n)=\sum_{m\le n}(-1)^{m+n}{n\choose m} f(m) \\ &(-1)^xF(x)=\sum_{m\le x}{x\choose m} (-1)^m f(m) \end{aligned} \]

我们可以通过 \(f(0),f(1),\cdots,f(n)\) 快速求出 \(F(0),F(1),\cdots, F(n)\) 的值。

因为 \(F(x)\) 在只考虑 \(x=0,1,\cdots,n\) 时等效于一个 \(n\) 次多项式,因此我们可以认为:

\[(-1)^x F(x)=\sum_{m=0}^n \frac{x^{\underline m}}{m!}(-1)^m f(m) \]

考虑 \((-1)^x F(x)\) 的下降幂多项式形式其实就是上式。

众所周知,对于多项式 \(g\):

\[g(x)=\sum_{m=0}^n g_m x^{\underline m} \\ \Rightarrow \mathrm e^x \sum_{m=0}^n g_m x^m=\sum_{m=0}^n \frac{g(m)}{m!}x^m \]

注意第二个式子并非下降幂多项式形式,而是把下降幂多项式形式下的系数当作普通多项式形式下的系数进行卷积。那么让 \(g(x)=(-1)^x F(x)\)

而我们发现 \(g_m=\frac{(-1)^m f(m)}{m!}\)。所以直接普通多项式乘法就可以求出 \(g(0),g(1),\cdots,g(n)\),进而求出 \(F(0),F(1),\cdots,F(n)\)。

目前已知的应用:「2020-2021 集训队作业」Tour

斯特林反演

\[\begin{aligned} &f(n)=\sum_{i=0}^n S(n,i)g(i)\Leftrightarrow g(n)=\sum_{i=0}^n s(n,i)f(i) \\ &f(n)=\sum_{i=0}^n (-1)^{n-i} c(n,i)g(i)\Leftrightarrow g(n)=\sum_{i=0}^n s(n,i)f(i) \\ &f(n)=\sum_{i=0}^n c(n,i)g(i)\Leftrightarrow g(n)=\sum_{i=0}^n (-1)^{n-i} s(n,i)f(i) \end{aligned} \]

\(S(n,i)\) 是第二类斯特林数,\(s(n,i)\) 是第一类斯特林数,\(c(n,i)=|s(n,i)|\)。

这两类斯特林数具有优秀的组合意义。

\(c(n,i)\) 是长度为 \(n\) 的排列中轮换个数为 \(k\) 的排列个数,\(S(n,i)\) 是 \(n\) 个互相区分的元素分成 \(k\) 个互不区分的集合的方案数,\(s,c,S\) 都可以递推 \(O(n^2)\) 求出。

举一个最基础的例子,存在不同元素之间的二元等价关系 \(R\),我们需要求出 \(f(n)\) 表示有多少种长度为 \(n\) 的序列使得两两元素均不满足等价关系 \(R\)。

那可以记 \(g(n)\) 表示有多少种长度为 \(n\) 的序列,并不做其它限制。

而根据等价关系可以对序列的元素划分等价类,因此枚举 \(i\) 表示序列中的元素可以划分成 \(i\) 个等价类,则有:

\[g(n)=\sum_{i=0}^n S(n,i) f(i) \]

然后进行反演,得到:

\[f(n)=\sum_{i=0}^n s(n,i) g(i) \]

就可以进行计算了。

标签:总结,le,反演,sum,det,计数,choose
From: https://www.cnblogs.com/imcaigou/p/18363635

相关文章

  • 暑假Java自学进度总结06
    一.今日所学:1.for循环for(初始化语句;条件判断语句;条件控制语句){循环体语句;}执行流程:1>执行初始化语句2>执行条件判断语句,若为true则执行循环体语句,若为false,循环结束3>执行条件控制语句4>回到2>继续执行条件判断语句注:初始化语句只执行一次2.while循环初始化语句;......
  • 关于ADC的一些总结
    前言        由于在STM32单片机中,主要是数字电路,而数字电路没有多少伏电压的概念,只有高电平和低电平两个概念,如果想要读取电压值,则需要经过ADC模数转换来读取对应引脚的模拟电压,然后存放到对应的寄存器种,通过变量来读取从而进行显示、判断等操作。1.ADC(Analog-Digita......
  • failed to solve: process “/bin/sh -c yum -y install vim“ did not complete succ
    网上有好多种方法(都试过了只有方法四可以用):方法一:systemctl restart  docker(生产上不建议)方法二:看看你的网络是否有问题,检查一下网络连通性方法三:有可能是容器版本的问题,推荐使用centos7,看网上说最新的镜像会有这类的的问题方法四:就像这个博主大佬说的修改主机源修改......
  • Servlet总结
    Serevlet一、概念Servlet(ServerApplet)是JavaServlet的简称,称为小服务程序或服务连接器,泛指用 Java编写的服务器端程序。在编程过程中也指一切 实现了Servlet接口的类(约定以Servlet结尾命名)。二、使用在src.com.qf.servlet包中创建Servlet01类extendHttpServlet,重写......
  • linux驱动总结
    一.前言做linux开发也有一段时间了,对整个系统已经熟悉了很多,linux是一个非常大的系统,现在对常见的驱动做一个总结,以此来加深记忆和理解。二.常见驱动及其子系统分类1.Linux设备分类linux系统抽象出的设备可以分为三类:char_dev,block_dev,net_dev。字符设备是产品开发用的最多......
  • 【课程总结】day24(下):大模型部署调用(vLLM+LangChain)
    前言在上一章【课程总结】day24(上):大模型三阶段训练方法(LLaMaFactory)内容中主要了解一个大模型的训练过程,无论是第三方的大模型还是自研的大模型,都需要部署到服务端,提供对应API接口供上层应用使用。所以,本章将主要了解vLLm+langchain的基本使用方法。大模型应用框架......
  • Spring经典面试题总结
    spring是什么?轻量级的开源的J2EE框架。它是一个容器框架,用来装javabean(java对象),中间层框架(万能胶)可以起一个连接作用,比如说把Struts和hibernate粘合在一起运用,可以让我们的企业开发更快、更简洁Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架–从大小与开销......
  • JS中构造函数继承问题注意事项总结
    在JavaScript中,继承是通过原型链来实现的。当你想要创建一个子类(比如Student)继承一个父类(比如Person)时,通常会使用Object.create来创建Student的原型对象。这背后有一些重要的原因:1.共享与独立性当你执行Student.prototype=Person.prototype时,Student的原型......
  • SQL常用思维总结
    1.将复杂查询拆分为子查询子查询指的是:一个查询语句嵌套在另一个查询语句内部的查询,作为上级查询的查询条件之一--查询课程1分数比课程2分数高的学生的学生信息、课程1分数、课程2分数selectstudent.*,score1,score2fromstudentjoin(selectt1.s_id,t1.s_scorescore1,t2......
  • SpringBoot的事务/调度/缓存/邮件发送和一些Spring知识点总结
    目录1、SpringBoot的事务管理2、SpringBoot的异步任务3、SpringBoot定时任务调度4、SpringBoot整合Mail发送邮件5、Spring框架中的Bean的作用域6、Spring框架中的Bean的线程安全7、Spring框架中的Bean生命周期8、Spring框架如何解决循环依赖?9、Spring框架中有哪些注......