题意题面陈述很清楚了。但是这个大蒜无炮真的很强(?)
Tag : 推式子 解方程 最优化问题
一般最优化问题要求答案取模有以下两种情况:
1.有通用的,固定的最优方案结论。
2.答案可以用能够储存的实数表示出来(分母分子不含有较大组合数或阶乘)。
对于这道题,因为没有一种显然的最优策略,所以我们猜测后者。
考虑如何计算一个点到另一个点的期望次数
(感觉这个问题莫名的典,但我好像又没做过)
令一个 长 n 的环上一对相隔 i 个点的点的期望操作次数为 f(i),i∈[0,n]
显然有以下结论
f(0)=0
f(i)=f(n−i)
拆开f(i)=f(i−1)+f(i+1)2+1
上式可转化为
f(i+1)=2f(i)−f(i−1)−2
f(i)=2f(i−1)−f(i−2)−2 (i>1)
发现这是一个环形的方程组,令 f(1)=x
则
f(2)=2f(1)−f(0)−2=2x−2
f(3)=2f(2)−f(1)−2=3x−6
f(4)=2f(3)−f(2)−2=4x−12
…
f(k)=kx−k2+k
如果你不想知道我是怎么发现这个规律的,请跳过这几行。
其实是这样的:
[f(i)f(i−1)1]=[f(i−1)f(i−2)1]×⎡⎢⎣210−100201⎤⎥⎦
在脑袋中运行 Brain++ 语言,发现这个矩阵的 k−1 次方等于
[f(k)f(k−1)1]=[f(1)f(0)1]×⎡⎢⎣k10−k+1−k+20k2−kk2−3k+21⎤⎥⎦
其实有时候用矩阵打表找规律很方便。
代入最开始的等式
f(n−1)=(n−1)x−(n−1)(n−2)=f(1)=x
x=n−1
f(i)=i(n−i)
于是我们就得到了这个优美的,没有分数的结论。
如何选择使得答案最优?
令 ans(p) 为选 p 做终点行时的答案。
ans(p)=n∑i=1f(|p−i|)×ai
拆开绝对值和 f 得到
ans(p)=p∑i=1i2×ai+(2p−n)p∑i=1i×ai+(pn−p2)p∑i=1ai+n∑i=p+1i2×ai+(2p+n)n∑i=p+1i×ai−(pn+p2)n∑i=p+1ai
用 int128 维护 ai,ai×i,ai×i2 的前缀和即可解决。
全部取 min 后再取模。
code
不是很理解考场上为啥做出来的人这么少。
虽然我并没有打
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步