「JSOI2018」机器人

在本题当中为了方便,我们将坐标范围改至 (0n1,0m1),行走即可视作任意一维在模意义下 +1.

同时,注意到一个位置只能经过一次,则可以令 ax,y(x,y) 这个位置往外走是向下还是向,方便考察。

首先考虑这个问题的方案数,此类网格图行走的问题一般需要考察对角线的特殊性质。

  • 观察 1(x,y),若 a(x1)modn,yax,(y1)modm,则要么 (x,y) 被经过了两次,要么没有被经过。

  • 推论 1:a,x,y,ax,y=a(x+a)modn,(ya)modm

考察推论 1 的组合表示,相当于将整个网格图分为了若干个组,每个组由若干条完整的副对角线构成,每组内 a 相同,很自然地我们可以进一步考虑每个组对角线的构成。

将网格图往左右不断复制延伸,考察一下此时 (0,0) 所在组内副对角线的在第一行的开头位置构成的集合。

不难发现即为 nx(xN),对应到原网格图内就是 nxmodm(xN) 的值。

根据裴蜀定理,这个值一定是 dx(d=(n,m),0x<md),因此可以知道 (0,0) 所在组的对角线集合就是从 x+y=0 开始每 d 个间距分布的对角线。

推广到所有组,发现第 i 组就是 x+y=i+dx(0x<n+md).

因此这个问题只需要确定 x+y=0d1d 条对角线上是如何走的即可确定全图是怎么走的,也即确定前 d 步是怎么走的。

考虑前 d 步怎么走是合法的,当且仅当第一次遇到走过的点在恰好走了 nm 步以后。

首先我们发现:对于某条对角线上的点 x+y=k 一定要恰好走 n+m(d(n+m)) 步以后才能再次回到这条对角线,在此期间,一定走了若干次完整的周期,则:

  • 观察 2:第一次走到一个重复点时一定恰好走完了若干个整周期。

  • 观察 3:同一周期内,决定第一次走到重复点时刻的与周期内走的顺序无关,只与周期内往下 / 往右走的次数有关。

假设一个周期内往下走了 a 步,则根据裴蜀定理,在第一维走回来需要 n(n,a)d 步,第二维类似地需要 m(m,da)d 步,因此第一次走回来的时刻为:lcm(n(n,a),m(m,da))d,我们需要满足:

lcm(n(n,a),m(m,da))d=nmlcm(n(n,a),m(m,da))=lcm(n,m)

对此,我们考察 n,m 所包含的每个质因子 p,令 α1=maxpini,α2=maxpimi

  1. min(α1,α2)=0.

p(n,a)α1>0,可知等式左侧一定比右侧少了至少一个因子 p,故 p(n,a),同理 p(m,da).

  1. min(α1,α2)>0

pd,若 p(n,a)pap(m,da) 故左侧两项均除去了至少一个 p,一定比右式至少少了一个 p.

同理可得 p(m,da)

综上,pnpm 总有 p(n,a),p(m,da) 故有上式成立的必要条件 (n,a)=(m,da)=1

而这显然也是充分条件,因此所有的方案数即:ad(da)[(n,a)=(m,da)=1],考虑回到原问题。

首先枚举合法的 a,对于每个 (x,y)(xa,yda),其如果在第一周期走的路径内那么所有周期当中第 x+y+1 步的位置都将随之确定,因此也可以确定这些位置当中最靠前的障碍的位置是在第几步,记作 wx,y.

于是有一个简单 dp,记 fi,j,k 为第一周期当中,确定了前 i+j 步的走法,第 i+j 步在 (i,j) 当前走到的所有位置中 w 的最小值为 k 的方案,转移显然,复杂度 O(Tn5).

通过一定的常数优化已经可以通过了,但本题存在更优的解法。

既然是周期性移动,那么自然可以将碰到障碍的步数分解为:第几周期 + 第一周期内的第几步。

枚举最终碰到障碍步数在第 t 周期,求出 fi,j 考虑完第一周期的前 i+j 步,第 i+j 步在 (i,j),走到的每一个位置的 w 都至少在在第 t+1 周期之后的方案,以及 gi,j 为确定了第 i+j+1d 步(走到 (a,da))第 i+j+1 前位置为 (i,j),路径上的每个位置的 w 至少在第 t 周期之后的方案。

枚举在哪个位置第一次碰到障碍,利用 f,g 合并即可,复杂度 O(Tn4).

posted @   Achtoria  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示