Codechef DECEMBER16 BOUNCE

题目大意

假设现在有个 RC 的盒子,一开始在 (0,0) 有颗珠子,你朝右上角45度方向把珠子弹出,珠子碰到墙壁会反弹(依据反射定律),珠子到了某个角后就弹出了,游戏结束。珠子每到一个墙,就会相对应的把墙上的字符记录到 S(R,C) 上,比如珠子先后碰到上下左右,那么 S(R,C)="TDLR" ,一个盒子的权值就是 S(R,C) 的长度。
现在给定一个字符串 S ,以及一个正整数N,问所有满足 S S(R,C)的前缀,且 1R,CN 的盒子的权值之和对 109+7 取模的值。

数据范围

N1010,|S|106

题解

首先我们要观察一些东西,记 f(R,C) 表示 RC 的矩阵的 |S| ,那么可以观察到,若 (R,C)=1,f(R,C)=R+C2 ,否则, f(R,C)=f(R(R,C),C(R,C)) 。接下来,对于那个输入的S的限制,我们可以理解为有个点,他有两个势能,记为 (a,b) ,初始为 (R,C) ,那么假如当前弹到左右两面墙,相当于 a<b ,然后势能变成 (R,ba) ,否则相当于 a>b ,势能变为 (ab,C) ,那么我们可以搞出来一些约束,形如 aR>bC 以及 xR<yC 这样,找到约束最紧的两个。现在考虑怎么求答案。

V(r,c)Ansg(n)g0(n)g(n)ValueAnsAnsh(n)Ans=1ar>bcxr<yc0=r=1nc=1,ar>bc,xr<ycnr(r,c)+c(r,c)2=d=1ng(nd)2r=1nc=1nV(r,c)=r=1nc=1,(r,c)=1n(r+c)V(r,c)=d=1ndμ(d)r=1n/dc=1n/d(r+c)V(r,c)=r=1nc=1n(r+c)V(r,c)=d=1ndμ(d)g0(nd)=2r=1nc=1nV(r,c)=d=1np=1ndpμ(p)g0(ndp)Value=d=1np|dpμ(p)g0(nd)=p|npμ(p)=d=1nh(d)g0(nd)

不同的 nd 只有 O(n) 种,对于某个 g0(n) ,把约束移下项,显然就可以用类欧几里德算法来做了,具体做法可以参考 这篇文章
把所有的 g0(n) 预处理出来的复杂度是 O(nlogn)
那么,只有能把 nd=1h(d) O(n) 个值处理出来,这题就做完了。
Google一发后可以发现, h×ϕ=e (这里是狄利克雷卷积),于是用杜教筛就好了。维护一下 μ,ϕ,h 各自的前缀和就可以 O(n23) 做完了。

因此这题的复杂度就是 O(T(nlogn+n23)+|S|) ,时限卡得有点紧,有些东西能预处理的需要尽量预处理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值