P6772 [NOI2020] 美食家
先假设没有美食节,容易得到一个矩阵优化的 dp。
加上美食节过后分成 k 段考虑,每段分别矩阵快速幂,时间复杂度为 O((5n)3klogT)。
这并不能通过本题。
可以思考快速幂优化乘法的本质,预处理出转移矩阵的 2 的幂。
原本快速幂是将一堆 5n×5n 的矩阵乘起来,最后再乘一个 1×5n 的矩阵,每一段的时间复杂度达到 O((5n)3logT)。
可以考虑使用结合律交换顺序,每一段分别用 1×5n 的矩阵乘一堆 5n×5n 的矩阵,这样复杂度降为 O((5n)2logT)。
因此总复杂度降为 O((5n)3logT+(5n)2klogT)。
CF113D Museum
设 f(u,v)(u≠v) 表示分别从 u,v 出发,在 s 相遇的概率。
设 deg(u) 表示 u 的度数。
假设从 (u,v) 走一条边到 (i,j)。
f(u,v)=p(u)p(v)f(u,v)+∑i≠uf(i,v)1−p(u)deg(u)p(v)+∑j≠vf(u,j)1−p(v)p(u)deg(v)+∑i≠u∑j≠vf(i,j)(1−p(u))(1−p(v))deg(u)deg(v)
移项得
(1−p(u)p(v))f(u,v)−∑i≠uf(i,v)1−p(u)deg(u)p(v)−∑j≠vf(u,j)1−p(v)deg(v)p(u)−∑i≠u∑j≠vf(i,j)(1−p(u))(1−p(v))deg(u)deg(v)=0
可以发现 f(s,s)=1,对于不等于 s 的 i,f(i,i)=0。
因此,这 n2−n 个方程每个右边都是一堆关于 f(i,i) 的线性组合。
左边有 n2−n 个未知数,右边有 n 个参数,对于左边高斯消元即可。
注意特判起点相同的情况。
P2973 [USACO10HOL]Driving Out the Piggies G
对于需要使用高斯消元解决的 dp 问题,必须保证边界值好确定。
设 f(u) 表示经过 u 点的期望次数。
f(u)=[u=1]+∑u→vf(v)1−pqdeg(v)
最后,i 点的答案为 f(i)pq。
CF24D Broken robot
设 f(i,j) 表示从 (i,j) 开始走,走到第 n 行的期望步数。
f(n,i)=0。
枚举 (i,j) 可能走到哪里,设走到 (x,y) 的概率为 p,答案为
f(i,j)=1+∑x,yf(x,y)p
直接高斯消元复杂度是 O(n6)。
但是由于不能往上走,因此可以一行一行地高斯消元,复杂度变为 O(n4)。
再仔细观察矩阵发现系数都在主对角线附近,因此可以做到 O(n2)。
UVA12177 First Knight
设 f(i,j) 表示从 (i,j) 走到 (n,m) 的期望步数。
dp(n,m)=0。
f(i,j)=1+∑x,yf(x,y)p((x,y)→(i,j))
暴力高斯消元复杂度为 O(n3m3)。
将坐标建立与编号的映射 (i,j)⟶(n−i)m+m−j+1。
可以考虑只保留上三角矩阵,即消掉下三角矩阵。
对于一个未知数 i,只需要遍历 (i,i) 到 (i+m,i+2m) 的矩阵就行了,时间复杂度优化为 O(nm3)。
P7016 [CERC2013]Captain Obvious and the Rabbit-Man
构造多项式
A(x)=(x−F1)(x−F2)⋯(x−Fk)=xk+b1xk−1+b2xk−2+⋯+bk
A(Fi)=Fki+b1Fk−1i+b2Fk−2i+⋯+bk=0
对 i=1→k 求和
k∑i=1A(Fi)=k∑i=1Fki+b1k∑i=1Fk−1i+b2k∑i=1Fk−2i+⋯+bk−1k∑i=1Fi+bkk=0
发现这样似乎没法用到题目给出的 pi,于是可以考虑先对 A(Fi) 乘 ai 再求和
k∑i=1A(Fi)ai=k∑i=1Fkiai+b1k∑i=1Fk−1iai+b2k∑i=1Fk−2iai+⋯+bk−1k∑i=1Fiai+bkk∑i=1ai=0
k∑i=1A(Fi)ai=pk+b1pk−1+b2pk−2+⋯+bk−1p1+bkk∑i=1ai=0
推到这里还是推不动,再在前面求和之前乘个 Fi
k∑i=1A(Fi)aiFi=pk+1+b1pk+b2pk−1+⋯+bkp1=0
于是
pk+1=−k∑i=1bipk−i+1
O(k2) 解出 bi,即可计算答案。
CF963E Circles of Waiting
f(x,y) 表示从 (x,y) 出发,走到距离大于 R 的点的期望步数。
如果 x2+y2>R2,f(x,y)=0。
f(x,y)=1+f(x−1,y)p1+f(x,y−1)p2+f(x+1,y)p3+f(x,y+1)p4
暴力高斯消元时间复杂度为 O(n6)。
考虑使用主元法。
将纵坐标从上到下,横坐标从左到右依次编号,取每个纵坐标最左边的横坐标为主元。
f(x+1,y)=f(x,y)−f(x−1,y)p1−f(x,y−1)p2−f(x,y+1)p4−1p3
可以达到 O(n3)。
P3211 [HNOI2011]XOR和路径
按位处理。
设 f(u) 表示从 u 出发到 n,这一位的异或和为 1 的概率。
f(u)=∑u→v[w=0]f(v)+[w=1](1−f(v))deg(u)
注意判断自环,自环的边只能连一次。
CF895C Square Subsets
完全平方数只与质因子的奇偶有关,小于等于 70 的质数只有 19 个,因此可以把每个数分解质因数后用二进制表示。
两个数想成等价于异或,原问题等价于异或和为 0 的真子集数。
假设线性基插入的元素个数为 cnt,那么答案为 2n−cnt−1(线性基的基底异或一定不为 0)。
P4869 albus就是要第一个出场
对于一个已经确定的线性基,新加入一个能被基底表示的数,会使得所有能被表示的数统一乘 2。
于是问题就转化为查询一个数在线性基中的排名。
P5607 [Ynoi2013] 无力回天 NOI2017
很明显是线段树 + 线性基。
但线性基无法下传标记,于是考虑差分。
设 ai−1⊕bi=ai,每次只需要支持单点修改即可。
可以发现 al→r 组成的线性基与,al 和 bl+1→r 组成的线性基相同(考虑 ai 的定义来证明)。
于是这道题可以在 O(nlognlog2V) 解决。
CF845G Shortest Path Problem?
图中的环可以任意添加,于是可以把所有环加入线性基中。
其实 1 到 n 的路径也可以任意选择,因为如果存在一条更优的路径,它会与原路径成环,一定会被加入线性基中。
CF1299D Around the World
发现边权值只达到 31,爆搜发现线性基的种类只有 374。
考虑先将 1 连出去边删掉,可以得到很多连通块,沿用 CF845G 的方法,把每个连通块的环加入线性基中,如果存在一个环的权值不能加入线性基中,那么这个连通块一定不能与 1 相连。
因为不存在长度大于 3 的简单环,因此 1 向这些连通块要么连一条边,要么连两条边。
设 dp(i,j) 表示前 i 的连通块中,线性基为 j 的方案数,分类转移即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】