线性代数与多项式

讲师:PinkRabbit 时间:20210629 地点:福建师范大学附属中学

Example.1 随机数生成器

题意:

给出一个随机数生成器(如下)

组询问,每组询问给定种子和 ,询问第 次生成的值

, , ,

题解:

这个过程可以用一个 的矩阵乘法来表示。设 的二进制表示为 ,则答案可以表示为:

如果直接做矩阵快速幂,则复杂度是 ,过个寂寞!

这时采用经典方法:讲 预处理出来,那么每次乘法时只需要进行矩阵乘向量即可,这个乘法是 的;结合位运算可以优化到 。但是总的复杂度还是 的,过不去。

考虑更大力的优化,我们直接抛弃二进制,使用 256 进制的这个做法,则复杂度将为

Example.2 城市道路问题

题意:

个城市,第 个城市有 个点权 (, , …, ;, , …, )

从城市 直接到 一共有 种方案, 可以等于

组询问,询问城市 步内到达城市 的方案数,对 取模

, , , 。1s, 128MB

题解:

首先对于每种边建一个虚点(也可以理解为 ),建立虚点到虚点的状态转移矩阵 。问题转化为:

左边的这个东西我们可以通过矩阵求逆轻松得到();如果逆不存在怎么办?

考虑大力倍增:

Example.3

题意:

一张 个点的有向完全图。

任意两点 之间的有向边 的边权是

求这张图的所有生成内向森林的边权乘积之和。, 模 $998244353。

题解:

考虑将每个点均连向一个虚点,这样内向森林个数就是这张图的内向树个数;同时,由于基尔霍夫矩阵的这一阶要去掉,那不妨就不管这个矩阵了,直接想办法求这张图的基尔霍夫矩阵的行列式即可。

注意到,这个矩阵是一个循环矩阵;而循环矩阵的行列式可以表示为:

其中 。证明:

设矩阵 ,有:

每一列都同时乘以一个数,则有:

所以有:

如何求 的这个乘积呢?先 一下,然后把每个位置全部乘起来就行了。

Example.4

题意:

给定一个 的排列 和一个序列 。定义一个 的排列 的值为

求有多少个 的排列 使得 为偶数。对 取模,

题解:

显然答案为:

考虑前面那个艾弗森括号,它的形式很接近行列式中的 项;枚举排列的任务也由行列式完成了,剩下的是如何解决后面的那个艾弗森括号。我们考虑构造下列矩阵:

显然

Example.5 九个太阳

题意:

给定 , , 满足 的幂,求

取模。,

题解:

倍数 类型的问题可以考虑单位根反演:

于是这题的式子可以写为:

搞定。一般来说,单位根相关题目都有一个 的次幂和

Example.6 复读机

题意:

在长度为 的序列中填入 , 使得它们出现次数均为 的倍数。

求方案数,模

, 。当 。1s, 512MB

题解:

显然有:

时:

时:

时:

对于隔 一个 的这种序列的 EGF 通常可以使用单位根来表示。

Example.7 XLkxc

题意:

,模

, 。1s, 512MB

题解:

是关于 次式。

是关于 次式(即关于 的)。

原式是关于 次式。直接插值插出来就行了。

Example.8 斗主地

题意:

张牌,从上到下标号为 , 标号为 的牌分数为 进行 轮洗牌,第 轮拿出顶上 张牌,从而分成两堆。

洗牌的过程是,若两堆各有 张牌,则分别有 概率拿出这堆的第一张牌作为洗牌后的第一张,然后递归确定余下的部分。

轮洗牌后各位置上的牌的期望分数(进行 次询问)

, ,

题解:

考虑这个发牌方式到底代表了什么?均匀分配!即每一种方案的概率是相等的。我们来证明一下:

这一组分别是在 处取得,那么显然这个方案的可能性为:

考虑在最.9后把项数补齐:

一通变换求和顺序得:

第一个括号是 ,第二个括号是 ,第三个括号刚好遍历了每一个第二堆中的数的剩余量,因此是

综上每一种情况的概率都是

既然是均等的,那么容易写出 的转移系数就是

如果一列的值是关于其位置的 次函数,那么经过一次线性变换后,新的一列也是 次函数;因此做前三行,把答案插值插出来就行。

Example.9 Arcs on a Circle

gugugu

Example.10

题意:

平面直角坐标系上有一个醉汉位于原点。

每一步,他分别有 ,,, 概率向西、南、东、北方向走一个单位长度。

移动 步,求经过的点数期望值(经过多次只算一次),保留三位小数。, 2s, 256MB

题解:

关于第一次经过,有一个非常神仙的做法。设 表示 时刻位于 的概率,这是可以 得到的。

表示 点第一次经过关于时间的概率生成函数。显然:

求逆然后求个前缀和,精细实现一下就是 的。

Example.11 机器人

题意:

个整数 , 在一个区间 中选取。

比较两个元素的大小,如果大小相同,认为较前的更小。从每个位置出发分别进行向左、向右两次试验。一次试验是往该方向找到最长的一段位置,使得它们的值都小于出发位置

求有多少种方案使得,每个位置的两次试验得到长度差不超过

答案模 , 。3s, 512MB

题解:

试验的长度差不超过二,意味着如果建出笛卡尔树,那么每个点必然在其区间的中间三个位置之一!因此我们向下递归计算,这本身的复杂度不是很大。

考虑计算过程中维护一个数组 表示当前点的子树对应的区间,选出的数的最大值是 的方案数,于是转移方程:

那么我们要维护这样一个 数组,能够支持左移、点积、前缀和。那么这个就是多项式了,计算点值然后插值来维护。但是注意,一定要分成多段多项式,因为整个连在一起就不是多项式了。

注意,这里的维护嘛,其实可以直接维护一些点值,然后一段中有效点值的个数即将少于其次数时,我再插值插一个出来备用即可,复杂度不大。

Example.12

题意:

设有一随机数生成器能生成 的整数,其中生成 的概率为 ,

用该生成器独立生成 个随机变量,设它们的和为

取得 的概率各为多少。

, ,1s, 256MB。

题解:

换句话说,题目是求:

我们拓展为更一般的形式:

,两边求导:

代入 得:

提取 系数得:

这样就可以 递推了。事实上,这个方法非常强大,甚至可以解决 不是整数得情况。

Example.13

题意:

给定一张 个点的有向图,给定两点

杏仁子图: 间(除两端外)点不交的若干条链组成的子图

次询问,每次强制 点与 点相连,求有多少个杏仁子图

, 2s, 1GB

题解:

实际上询问只有 种……

表示从 出发到 经过点集 的方案数,这个可以 轻松得到;从而可以处理出 表示第一步走了 的到 的路径个数。

把所有的 拼起来作为集合幂级数 ,那么我们实际上要求的就是:

(上述为不交并卷积, 是因为要除掉具体每部分是从哪个 来的)

我们把集合幂级数当作一个 次的形式幂级数,但是每一项的系数是一个集合幂级数(服从 卷积);原有的每个集合仅仅加到 的那个位置上。我们称这个多项式叫占位多项式。

我们发现,子集卷积等价于占位多项式的普通卷积(其中系数按照 卷积),尽管反复乘法会多一些无用的项,但是因为是真的无用,所以就压根不用管)。

进而, 也可以用这种占位多项式的普通卷积来定义;而普通卷积可以通过 ' 从而递推得到。复杂度就是 的(内层还有一个 .

处理出了 ,我们就可以考虑怎么统计答案。我们把 再进行一次 FWT,处理出子集前缀和;对于每个 直接枚举 ,用 统计进答案(FWT 的结果)。复杂度

总复杂度