题目大意
假设现在有个
R∗C
的盒子,一开始在
(0,0)
有颗珠子,你朝右上角45度方向把珠子弹出,珠子碰到墙壁会反弹(依据反射定律),珠子到了某个角后就弹出了,游戏结束。珠子每到一个墙,就会相对应的把墙上的字符记录到
S(R,C)
上,比如珠子先后碰到上下左右,那么
S(R,C)="TDLR"
,一个盒子的权值就是
S(R,C)
的长度。
现在给定一个字符串
S
,以及一个正整数
数据范围
N≤1010,|S|≤106
题解
首先我们要观察一些东西,记
f(R,C)
表示
R∗C
的矩阵的
|S|
,那么可以观察到,若
(R,C)=1,f(R,C)=R+C−2
,否则,
f(R,C)=f(R(R,C),C(R,C))
。接下来,对于那个输入的S的限制,我们可以理解为有个点,他有两个势能,记为
(a,b)
,初始为
(R,C)
,那么假如当前弹到左右两面墙,相当于
a<b
,然后势能变成
(R,b−a)
,否则相当于
a>b
,势能变为
(a−b,C)
,那么我们可以搞出来一些约束,形如
aR>bC
以及
xR<yC
这样,找到约束最紧的两个。现在考虑怎么求答案。
不同的 nd 只有 O(n√) 种,对于某个 g0(n) ,把约束移下项,显然就可以用类欧几里德算法来做了,具体做法可以参考 这篇文章
把所有的 g0(n) 预处理出来的复杂度是 O(n√logn) 。
那么,只有能把 ∑nd=1h(d) 的 O(n√) 个值处理出来,这题就做完了。
Google一发后可以发现, h×ϕ=e (这里是狄利克雷卷积),于是用杜教筛就好了。维护一下 μ,ϕ,h 各自的前缀和就可以 O(n23) 做完了。
因此这题的复杂度就是 O(T(n√logn+n23)+|S|) ,时限卡得有点紧,有些东西能预处理的需要尽量预处理。