社区讨论

一种较为简单的直接对整体函数插值的解法

P7116[NOIP2020] 微信步数参与者 20已保存回复 26

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
26 条
当前快照
1 份
快照标识符
@lobyfiqj
此快照首次捕获于
2023/10/30 04:59
2 年前
此快照最后确认于
2023/11/04 10:16
2 年前
查看原帖
其实并不用强行拆式子拆出「自然数整数次幂的前缀和」形式再插值。
以下这段粘自我的 blog:
求从每个点出发能走的步数之和等同于求每一步合法位置的数量之和。更进一步地,假设每一维的出发坐标均为 00,在走了 ii 步之后第 jj 维经过坐标的最小值为 li,jl_{i, j},最大值为 ri,jr_{i, j},那么答案为 ij=1k[wj(ri,jli,j)]\sum_{i} \prod_{j = 1}^k [w_j - (r_{i, j} - l_{i, j})]
将每 nn 步视为一个周期,那么从第二个周期开始,每个周期内 li,j,ri,jl_{i, j}, r_{i, j} 的变化情况是相同的。第一个周期的答案可以暴力计算,第 x(x2)x(x \geq 2) 个周期的答案可以表示为一个关于 xx 的函数 f(x)=i=1nj=1k[wj(rn,jln,j)ci,j(x2)cn,j]f(x) = \sum_{i = 1}^n \prod_{j = 1}^k[w_j - (r_{n, j} - l_{n, j}) - c_{i, j} - (x - 2) c_{n, j}],其中 ci,jc_{i, j} 表示从第二个周期开始的每个周期内,走了 ii 步之后第 jj 维坐标的 r,jl,jr_{*, j} - l_{*, j}* 即对应总步数)会增加多少。注意到整个 f(x)f(x) 是一个关于 xxkk 次多项式,因此我们计算答案所需要的 f(x)f(x) 的前缀和则可以表示为一个 k+1k + 1 次多项式,当 xx 较大时,使用拉格朗日插值即可求得结果。
然而,即使用插值不是求 f(x)f(x) 的前缀和,而是直接求每个 f(x)f(x),也能够通过官方数据,因为后面的测试点尽管 wiw_i 很大但 win\frac{w_i}{n} 较小。然后我在 UOJ 上自己把自己叉了。

回复

26 条回复,欢迎继续交流。

正在加载回复...