LR 8 Hello 戊戌

首先声明题面中加入 Moejy0viiiiiv 与本人无关。

由于本题的数据范围在样例造好之后又进行了更改,所以初始时题面中出现了与数据范围不符的样例,如果对您的做题产生影响,我深表歉意。

算法一

(P(x, y)) 为走到 ((x, y)) 的概率,则所求即为 (sum_{x, y} P(xD, yD))

由于 (N leq 10000),所以直接按照 (P(x, y) = P(x, y - 1) * A + P(x - 1, y) * B) 转移即可。

时间复杂度 (O(N^2))

空间复杂度 (O(N^2)),可以使用滚动数组 (O(N))

可以通过第一个子任务,预计得分 (9) 分。

算法二

我们设 (F_z(x) = sum_{i = 0}^z P(i, z - i) * x^i mod (x^D - 1)),那么有 (F_z(x) = F_{z - 1}(x) * (Bx + A))。所求即为 ([x^0] sum_{i} [iD leq N] F_{iD}(x))。我们可以直接通过枚举 (i) 来计算。

时间复杂度 (O(ND))

空间复杂度 (O(D))

可以通过第二个子任务,结合算法一预计得分 (21) 分。

算法三

(F) 求和可以考虑通过倍增的思想进行。

我们另 (H(x) = (Bx + A)^D mod (x^D - 1))(SH_n(x) = sum_{i = 1}^n H(x))

有转移

  • (SH_{n + 1}(x) = SH_n(x)cdot H(x) + H(x))

  • (SH_{2n}(x) = SH_n(x)cdot H(x)^n + SH_n(x))

时间复杂度 (O(D^2 log N))

空间复杂度 (O(D))

可以通过子任务二、三,结合算法一预计得分 (48) 分。

算法四

现在考虑有坑的情况。
在计算 ([x^0] sum_{i} F_{iD}(x)) 时,我们可以对一段连续的不包含坑的 (x + y) 的值的区间 ([l, r]) 计算贡献。
如果我们能快速求出 (F_l(x)) ,那么就能将问题转化为无坑的情况了。

我们设 (G_z(x) = sum_{i = 0}^z P(i, z - i) * x^i)
如果能得到 (G_l(x)),就可以通过在原 (F_l(x)) 的对应位置上减去相应的值得到有坑情况下的 (F_l(x))
可以发现 (G) 的转移与 (F) 相同。
又由于所有坑 (x leq M),所以只用维护 (G(x) mod x^M)

如果使用算法二的计算方法,时间复杂度 (O((D + M)N))

空间复杂度 (O(D + M))

可以通过子任务二、四,结合算法一、三预计得分 (56) 分。

算法五

在算法三、四的基础上考虑如何快速计算 (G_z(x))

可以发现对于无坑区间 ([l, r])(G_r(x) = G_l(x)cdot (Bx + A)^{r - l} mod x^M)([x^i](Bx + A)^m = inom{m}{i} B^i A^{m - i})
可以通过一次多项式乘法进行转移。

时间复杂度 (O(K(D log D + M log^2 M) log N))

空间复杂度 (O(D + M))

预计得分 (100) 分。

原文地址:https://www.cnblogs.com/King-George/p/8460926.html