染色问题

给出一个个点条边无向图,求染色方案数(相邻点异色)。

,复杂度与无关。

染色 缩点

染色数是 NPC 的。注意到的条件。常规思路是理解为一棵树加上若干条非树边,但这并不能方便地处理染色问题。

问题转化:对于一条边,设分别表示同色和异色时边的权值。初始时。图的权值是边权之积。那么问题转化为求所有染色情况下的图的权值之和。

对于度数为,假设他连到了,那么可以直接删掉它,最后答案乘上。实际上,应该是答案乘上

对于度数为的点,假设它分别连接了,那么删掉,加一条边,有

  • 。即分同色和异色两种情况考虑。
  • 。即分三种情况考虑。

有一个小细节:如果删除出现了重边,那么应该把两条边合并,权值则是分别相乘。

这样图中就只剩下了度及以上的点。即。又因为,可以得到

设新图为,设表示用种颜色对集合中的点染色的方案数。则

从而算出答案。

时间复杂度

代码

The Journey of Geor Autumn

给出,求有多少个的排列满足

DP

枚举在排列中出现的位置。显然它只能出现在中。假设

那么左边的位置可以随便填。右边的位置则是个递归子问题。设表示长度为的排列的答案,因此

变换一下可以得到

那么维护一下的前缀和即可计算。

代码

Sum of Log

给出,计算

DP 数位

即统计的二进制位数。

表示考虑到第位(从高到低或者从低到高都行)的方案数,表示贡献和。

状态包括:是否到达上界、当前的数字是否为(是否有最高位的)。

时间复杂度

代码

IOer

给出,计算

生成函数 组合意义

直接分治 NTT 没有用到的特殊形式。

这个组合意义做法是题解做法,感觉很反思维。

考虑我们要求的是

假装我们有理有据地想到:构造一个序列计数问题。

我们定义一个球具有编号和颜色两种属性:对于编号的球,有种颜色可选。对于编号为的球,有种颜色可选。两个球不同当且仅当颜色或者编号不同。考虑

求长度为的球的序列满足:

  1. 编号在中的球都有出现;
  2. 表示编号为的球第一次出现的位置,那么,有

的方案数。

枚举序列,那么位置上的球有种选法(编号被钦定了)。只能放编号为的球,因此有种选法。能放编号为或者的球,因此有种选法。推广得到,总方案数是

不妨设

,那么得到

那么我们只需要求出序列的方案数即可求出答案。

不妨去掉第二个条件。由于编号的球的可选颜色数都是,因此可以看作等价。则

长度为的球的序列满足:编号在中的球都有出现

的方案数是

这个问题可以容斥:钦定有个编号的球没出现,得到

这样我们就得到了问题的答案。

Flip and Reverse

你有一个 01 串,每次你可以选择的一个子串满足中 01 出现的次数相等,然后将其反转并交换 01 字符(0 变 1,1 变 0)。求若干次操作最小化的字典序,并输出这个新的

折线图 贪心

01 序列通常可以理解为:

  1. 括号序列
  2. 折线图

使用折线图来理解,相当于每次我可以反转一段折线。

进一步,其实我们不关心折线图的形态,我们只关心每一层的上行和下行的折线数。

进一步,我们甚至不用区分是上行还是下行。也就是说,记表示之间的折线数。那么我们的问题转化成,优先往下走,要求走完所有折线,求路径。

可以局部贪心。

朴素策略:在每一步,如果能够往下走就走。

这个策略有个问题:如果上面存在未走的折线,而下面的折线数是 1(回不来),那么就走不完所有折线了。

所以特判一下,大于 1 或者上面已经走完了才走下面即可。

时间复杂度

代码

Latin Square

给出一个的 Latin Square:每一行每一列都是的排列的矩阵。维护以下操作:

  • 每一行循环左移 / 右移一位。
  • 每一列循环上移 / 下移一位。
  • 将每一行的排列取其逆元。
  • 将每一列的排列取其逆元。

一个排列的逆元是指排列使得

输出最终的矩阵。操作次数不超过

矩阵 Latin Square

考虑排列的逆元:

不妨将矩阵映射为三维点:

那么对行取逆元相当于:。我们这个变换并不是原题目中的变换。严格来说,应该每一行再按照第二维坐标排序才行。但注意,我们维护的是三维空间的点集,不存在顺序的问题。

同理,对列取逆元相当于

也就是说,取逆元等价于坐标不同维度的交换。之后的部分就 trivial 了。

代码

珍珠

范围内的整数均匀随机变量。问满足以下条件的概率:

  • 可以找出至少个 pair,每个 pair 包含两个值相同的变量。

CTS2019 生成函数

这题有个很迷的地方。先二项式反演再推 gf 可以很轻松,但直接推 gf 就会有一些高深步骤。

表示值为的变量的个数。那么条件等价于

变换一下得到。也就是说出现次数为奇数的变量数

于是我们设表示出现次数为奇数的有个的方案数。方案数除以就是答案。

直接干

这玩意可以直接有

然后就会有一些 神必操作。这里就不复读了。

复读一个稍微好一点的。

考虑容斥,我们钦定个数出现奇数次,其他的不做限制。那么有

解释一下

序列的 EGF 是,这个序列在是奇数时值为,否则为

的含义是选个数出现奇数次的方案数。其他数的方案数就是

因为是 EGF,得乘上一个表示系数。

不妨设。那么可以用容斥(二项式反演)算出。

这玩意可以这么化简:

化简的方向就是,能提到前面去的就提到前面去。

相关的部分分开,可以做卷积。卷积的长度是的,故时间复杂度

树上游走

给定一颗个点的树,每个点有点权,你在点开始随机游走。

当你离开一个点第二次的时候这个点就会消失,与其相连的所有边也会消失。

你每次会等概率地选择一个与当前所在节点有边相连的一个未消失节点并前往那个点。

如果不存在与当前所在节点有边相连的点,你就会停止随机游走并等于获取当前所在节点权值的分数。

求你获得分数的期望,对取模。

DP 期望 分类讨论

为根。钦定最后走到的结点是

表示结点的度。

容易发现,与相邻的结点都必须被删掉。因此,否则不可能停在

的简单路径上的点是必经点。由此我们可以按照结点访问顺序(DFS)刻画出 DP 状态。考虑到改变结点度的因素,设表示从出发第一次到达的概率。

第一部分

表示的父节点。那么我们一定先到达再到达。从,走这条边的概率取决于的度。为了方便转移,设表示删掉并第一次到达的概率。

第一种情况:到达后直接到

第二种情况:到达后,先走到的儿子),再走回来,再去。这种情况,必然会被删除。

第三种情况:到达后,走到某个儿子)的子树中的某个结点),然后走回。第二次到达时,会发生变化,因为会被删除。这种情况下,也会被删除。

不妨设简单路径上的点顺次构成序列)。那么可以发现除了,其他结点都会被删。因此的贡献是

于是

第四种情况:要删除,还有一个走法:。这个走法会同时删除

因此有

注意:。这很好理解,因为没有父节点,因此不存在「删掉的父节点」这样的操作。

第二部分

考虑统计答案。

首先,要能最终停在的条件是

我们必须要删掉或者没有父节点才能保证停在

第一种情况:在第一次到达时删掉

如果是个叶子结点(此时必然有),那么对答案的贡献就是

如果是个只有一个儿子的结点,那么我们可以模仿第三种情况的 DP 转移,先删掉走到,再走到子树里的结点)再走回,以删除。这部分的贡献是

第二种情况:在第二次到达时删掉

这种情况适用于是叶子结点,那么我们第一次到达后一定会走的路线。因此贡献为

代码

树的同构

给出一个个点的树,要求找到两个同构的不相交的连通块,求连通块最大大小。

枚举一个点,则父亲的边将这棵树分成两个部分。然后选一个不在子树里的点,做为另一个部分的根。这样就可以树形 DP 了。表示的子树的最大同构连通块,且匹配。

转移是个二分图最大权匹配。用 KM 算法做就行。

这题的一个难点是算复杂度。

考虑这个状态被计算的次数,复杂度为

我也不知道为啥它是。但既然题解这么说了那就是吧。

移球游戏

个柱子,每个柱子上有个位置。第个柱子上放满了球,颜色为的球有个,总共个球。

每次你可以把一个柱子顶端的球移到另一个柱子顶端,前提是目标柱子有空位。

要求在步内将每种颜色的球各自集中到一个柱子上。

首先,这东西可以桶排。

直接桶排不太行。考虑分治。

将颜色小于的记为,否则记为。那么我们每一轮,对于当前区间柱子,干两件事:

  • 对于每个柱子,把它变成的形式。
  • 把每个柱子两两合并,最终变成全或全的形式。

这两个都可以简单操作得到。

操作一就不说了。对于操作二,我的方法是:对于两个柱子的合并可以做到,对于两个的柱子,把其中一个反转一下就行。

这样的步数是大概是的。

代码