好高妙!
大致思想是给每个局面构造一个势能函数 F(a1,a2,…,an),使得 ∑E(F(a′1,a′2,…,a′n))−E(F(a1,a2,…,n))=−1,其中 a′ 取遍 a 的后继状态。这样我们就能直接用终态的势能函数减去初始态的势能函数计算期望,即答案为 E(S)−E(T)。
可以考虑设 F(a1,a2,…,an)=n∑i=1f(ai)。只要能构造出 f(x) 就能计算了。
设 g(x)=f(x)−f(x−1)。推式子可以发现即要求:
xm×g(x)×(n−2)m+x(n−1)m−(m−x)2(n−1)m2×g(x+1)=1n
令 g(0)=0,即可得到 g 的递推式,再做一遍前缀和即可得到 f(x)。
设 ai 为 i 接着的点,设 F(a1,a2,…,an)=n∑i=1f(ai)。即要求对于任意 x,y,都有:
12(f(x+1)+yf(0))+12(f(y+1)+xf(0))=f(x)+f(y)−1
令 f(0)=0,有:
12f(x+1)+12f(y+1)−f(x)−f(y)=−1
考虑 f 能满足这个条件的一个必要条件:
12f(x+1)−f(x)=−12
即 f(x+1)=2f(x)−1。递推计算即可。
推式子过程略去。最后可以得到 f(x+1)=(3n−2x)f(x)−(2n−x)f(x−1)n−x。
但是没法线性预处理逆元,只能递推时维护分子和分母。设第 x 项的分子为 f(x),分母为 g(x)。有:
f(x+1)g(x+1)=(3n−2x)f(x)g(x−1)−(2n−x)f(x−1)g(x)(n−x)g(x)g(x−1)
O(n) 计算即可通过。
考虑用相邻两个球之间的距离来描述一个状态。
设距离序列为 a1,a2,…,ak(忽略 0)。考虑鞅与停时定理,设一个状态的势能为 k∑i=1f(ai),一次操作能使得势能期望减少 1。那么:
1=1nk∑i=1f(ai)+f(aimodn+1)−f(ai−1)−f(aimodn+1+1)
设 g(x)=f(x+1)−f(x),有:
n=k∑i=1g(ai−1)−g(aimodn+1)
考虑每个数的贡献,有:
n=k∑i=1g(ai−1)−g(ai)
不难发现令 g(x−1)−g(x)=nmx 满足要求,因为 k∑i=1ai 恒等于 m。
若令 g(0)=0,那么 g(x)=−nm(x+12),因为我们需要在操作后删除 a 中的 0 所以必须令 f(0)=0,那么有 f(x)=−nm(x+13)。
终止状态的势能为 f(m)。于是用初始状态势能减去终止状态势能就是答案。时间复杂度 O(nlogn)(瓶颈在对每个球的位置排序)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话