讲师:PinkRabbit 时间:20210629 地点:福建师范大学附属中学
给出一个随机数生成器(如下)
xxxxxxxxxx
1ull seed = n;
2int get_rand() { seed ^= seed << 13, seed ^= seed >> 17, seed ^= seed << 5; return seed; }
组询问,每组询问给定种子和 ,询问第 次生成的值
, , ,
这个过程可以用一个 的矩阵乘法来表示。设 的二进制表示为 ,则答案可以表示为:
如果直接做矩阵快速幂,则复杂度是 ,过个寂寞!
这时采用经典方法:讲 预处理出来,那么每次乘法时只需要进行矩阵乘向量即可,这个乘法是 的;结合位运算可以优化到 。但是总的复杂度还是 的,过不去。
考虑更大力的优化,我们直接抛弃二进制,使用 256
进制的这个做法,则复杂度将为 。
个城市,第 个城市有 个点权 (, , …, ;, , …, )
从城市 直接到 一共有 种方案, 可以等于 。
组询问,询问城市 在 步内到达城市 的方案数,对 取模
, ,, 或 , 。1s, 128MB
首先对于每种边建一个虚点(也可以理解为 ),建立虚点到虚点的状态转移矩阵 。问题转化为:
左边的这个东西我们可以通过矩阵求逆轻松得到();如果逆不存在怎么办?
考虑大力倍增:
一张 个点的有向完全图。
任意两点 之间的有向边 的边权是 。
求这张图的所有生成内向森林的边权乘积之和。, 模 $998244353。
考虑将每个点均连向一个虚点,这样内向森林个数就是这张图的内向树个数;同时,由于基尔霍夫矩阵的这一阶要去掉,那不妨就不管这个矩阵了,直接想办法求这张图的基尔霍夫矩阵的行列式即可。
注意到,这个矩阵是一个循环矩阵;而循环矩阵的行列式可以表示为:
其中 。证明:
设矩阵 ,有:
每一列都同时乘以一个数,则有:
所以有:。
如何求 的这个乘积呢?先 一下,然后把每个位置全部乘起来就行了。
给定一个 到 的排列 和一个序列 。定义一个 到 的排列 的值为
求有多少个 到 的排列 使得 为偶数。对 取模,。
显然答案为:
考虑前面那个艾弗森括号,它的形式很接近行列式中的 项;枚举排列的任务也由行列式完成了,剩下的是如何解决后面的那个艾弗森括号。我们考虑构造下列矩阵:
显然 。
给定 , , 满足 是 的幂,求
对 取模。, 。
倍数 类型的问题可以考虑单位根反演:
于是这题的式子可以写为:
搞定。一般来说,单位根相关题目都有一个 的次幂和 。
在长度为 的序列中填入 , 使得它们出现次数均为 的倍数。
求方案数,模 。
, 。当 时 。1s, 512MB
显然有:
当 时:
当 时:
当 时:
对于隔 个 一个 的这种序列的 EGF
通常可以使用单位根来表示。
求 ,模 。
, 。1s, 512MB
是关于 的 次式。
是关于 的 次式(即关于 的)。
原式是关于 的 次式。直接插值插出来就行了。
有 张牌,从上到下标号为 , 标号为 的牌分数为 进行 轮洗牌,第 轮拿出顶上 张牌,从而分成两堆。
洗牌的过程是,若两堆各有 张牌,则分别有 概率拿出这堆的第一张牌作为洗牌后的第一张,然后递归确定余下的部分。
求 轮洗牌后各位置上的牌的期望分数(进行 次询问)
, , 。
考虑这个发牌方式到底代表了什么?均匀分配!即每一种方案的概率是相等的。我们来证明一下:
设 这一组分别是在 处取得,那么显然这个方案的可能性为:
考虑在最.9后把项数补齐:
一通变换求和顺序得:
第一个括号是 ,第二个括号是 ,第三个括号刚好遍历了每一个第二堆中的数的剩余量,因此是 。
综上每一种情况的概率都是 。
既然是均等的,那么容易写出 的转移系数就是 。
如果一列的值是关于其位置的 次函数,那么经过一次线性变换后,新的一列也是 次函数;因此做前三行,把答案插值插出来就行。
gugugu
平面直角坐标系上有一个醉汉位于原点。
每一步,他分别有 ,,, 概率向西、南、东、北方向走一个单位长度。
移动 步,求经过的点数期望值(经过多次只算一次),保留三位小数。, 2s, 256MB
关于第一次经过,有一个非常神仙的做法。设 表示 时刻位于 的概率,这是可以 得到的。
设 ,, 表示 点第一次经过关于时间的概率生成函数。显然:
将 求逆然后求个前缀和,精细实现一下就是 的。
个整数 , 在一个区间 中选取。
比较两个元素的大小,如果大小相同,认为较前的更小。从每个位置出发分别进行向左、向右两次试验。一次试验是往该方向找到最长的一段位置,使得它们的值都小于出发位置
求有多少种方案使得,每个位置的两次试验得到长度差不超过 。
答案模 ,, 。3s, 512MB
试验的长度差不超过二,意味着如果建出笛卡尔树,那么每个点必然在其区间的中间三个位置之一!因此我们向下递归计算,这本身的复杂度不是很大。
考虑计算过程中维护一个数组 表示当前点的子树对应的区间,选出的数的最大值是 的方案数,于是转移方程:
那么我们要维护这样一个 数组,能够支持左移、点积、前缀和。那么这个就是多项式了,计算点值然后插值来维护。但是注意,一定要分成多段多项式,因为整个连在一起就不是多项式了。
注意,这里的维护嘛,其实可以直接维护一些点值,然后一段中有效点值的个数即将少于其次数时,我再插值插一个出来备用即可,复杂度不大。
设有一随机数生成器能生成 到 的整数,其中生成 的概率为 , 。
用该生成器独立生成 个随机变量,设它们的和为 。
求 取得 的概率各为多少。
模 ,, ,1s, 256MB。
换句话说,题目是求:
我们拓展为更一般的形式:
设 ,两边求导:
代入 得:
提取 系数得:
这样就可以 递推了。事实上,这个方法非常强大,甚至可以解决 不是整数得情况。
给定一张 个点的有向图,给定两点 。
杏仁子图: 间(除两端外)点不交的若干条链组成的子图
次询问,每次强制 点与 点相连,求有多少个杏仁子图
, 2s, 1GB
实际上询问只有 种……
设 表示从 出发到 经过点集 的方案数,这个可以 轻松得到;从而可以处理出 表示第一步走了 的到 的路径个数。
把所有的 拼起来作为集合幂级数 ,那么我们实际上要求的就是:
(上述为不交并卷积, 是因为要除掉具体每部分是从哪个 来的)
我们把集合幂级数当作一个 次的形式幂级数,但是每一项的系数是一个集合幂级数(服从 卷积);原有的每个集合仅仅加到 的那个位置上。我们称这个多项式叫占位多项式。
我们发现,子集卷积等价于占位多项式的普通卷积(其中系数按照 卷积),尽管反复乘法会多一些无用的项,但是因为是真的无用,所以就压根不用管)。
进而, 也可以用这种占位多项式的普通卷积来定义;而普通卷积可以通过 ' 从而递推得到。复杂度就是 的(内层还有一个 .
处理出了 ,我们就可以考虑怎么统计答案。我们把 再进行一次 FWT
,处理出子集前缀和;对于每个 直接枚举 ,用 统计进答案( 是 FWT
的结果)。复杂度 。
总复杂度 。