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

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

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

  • 观察 1:\(\forall (x, y)\),若 \(a_{(x - 1) \bmod n, y} \ne a_{x, (y - 1) \bmod m}\),则要么 \((x, y)\) 被经过了两次,要么没有被经过。

  • 推论 1:\(\forall a, x, y, a_{x, y} = a_{(x + a) \bmod n, (y - a) \bmod m}\)

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

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

不难发现即为 \(nx(x \in \mathbb{N})\),对应到原网格图内就是 \(nx \bmod m(x \in \mathbb{N})\) 的值。

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

推广到所有组,发现第 \(i\) 组就是 \(x + y = i + dx(0 \le x < \frac{n + m}{d})\).

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

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

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

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

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

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

\[\mathrm{lcm}\left(\frac{n}{(n, a)}, \frac{m}{(m, d - a)}\right)d = nm \Longleftrightarrow \mathrm{lcm}\left(\frac{n}{(n, a)}, \frac{m}{(m, d - a)}\right) = \mathrm{lcm}(n, m)
\]

对此,我们考察 \(n, m\) 所包含的每个质因子 \(p\),令 \(\alpha_1 = \max_{p ^ i \mid n} i, \alpha_2 = \max_{p ^ i \mid m} i\)

  1. 若 \(\min(\alpha_1, \alpha_2) = 0\).

若 \(p \mid (n, a)\) 则 \(\alpha_1 > 0\),可知等式左侧一定比右侧少了至少一个因子 \(p\),故 \(p \nmid (n, a)\),同理 \(p \nmid (m, d - a)\).

  1. 若 \(\min(\alpha_1, \alpha_2) > 0\)

则 \(p \mid d\),若 \(p \mid (n, a)\) 则 \(p \mid a \Rightarrow p \mid (m, d - a)\) 故左侧两项均除去了至少一个 \(p\),一定比右式至少少了一个 \(p\).

同理可得 \(p \nmid (m, d - a)\)

综上,\(\forall p \mid n \lor p \mid m\) 总有 \(p \nmid (n, a), p \nmid (m, d - a)\) 故有上式成立的必要条件 \((n, a) = (m, d - a) = 1\)

而这显然也是充分条件,因此所有的方案数即:\(\sum\limits_{a} ^ d \binom{d}{a}[(n, a) = (m, d - a) = 1]\),考虑回到原问题。

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

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

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

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

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

枚举在哪个位置第一次碰到障碍,利用 \(f, g\) 合并即可,复杂度 \(\mathcal{O}(Tn ^ 4)\).

「JSOI2018」机器人的更多相关文章

  1. LOJ 2550 「JSOI2018」机器人——找规律+DP

    题目:https://loj.ac/problem/2550 只会写20分的搜索…… #include<cstdio> #include<cstring> #include&l ...

  2. 【LOJ】#2550. 「JSOI2018」机器人

    题解 我不会打表找规律啊QAQ 规律就是 对于\(n = m\)我们每一条左下到右上的对角线上的点的走法都是一样的且每n步一个轮重复 对于\(n != m\)我们找到最大公约数\(d\),在每个\(d ...

  3. 「JSOI2018」战争

    「JSOI2018」战争 解题思路 我们需要每次求给一个凸包加上一个向量后是否与另外一个凸包相交,也就是说是否存在 \[ b\in B,(b+w)\in A \] 这里 \(A, B\) 表示凸包内部 ...

  4. @loj - 3157@「NOI2019」机器人

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 R 喜欢研究机器人. 最近,小 R 新研制出了两种机器人,分 ...

  5. LOJ 2548 「JSOI2018」绝地反击 ——二分图匹配+网络流手动退流

    题目:https://loj.ac/problem/2548 如果知道正多边形的顶点,就是二分答案.二分图匹配.于是写了个暴力枚举多边形顶点的,还很愚蠢地把第一个顶点枚举到 2*pi ,其实只要 \( ...

  6. LOJ 2551 「JSOI2018」列队——主席树+二分

    题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用 ...

  7. LOJ 2547 「JSOI2018」防御网络——思路+环DP

    题目:https://loj.ac/problem/2547 一条树边 cr->v 会被计算 ( n-siz[v] ) * siz[v] 次.一条环边会被计算几次呢?于是去写了斯坦纳树. #in ...

  8. LOJ #2547 Luogu P4517「JSOI2018」防御网络

    好像也没那么难写 LOJ #2547 Luogu P4517 题意 在一棵点仙人掌中等概率选择一个点集 求选出点集的斯坦纳树大小的期望 定义点仙人掌为不存在一个点在多个简单环中的连通图 斯坦纳树为在原 ...

  9. LOJ 2546 「JSOI2018」潜入行动——树形DP

    题目:https://loj.ac/problem/2546 dp[ i ][ j ][ 0/1 ][ 0/1 ] 表示 i 子树,用 j 个点,是否用 i , i 是否被覆盖. 注意 s1<= ...

随机推荐

  1. 【python】QT5 cvimg 转 pixmap

    自己乱搞了一个 import cv2 from PIL import Image imageRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) im = Image. ...

  2. Mybatis获取自增主键的值

    pojo: public class User { private Integer id; private String name; private String pwd; setter和getter ...

  3. Windows下SQL Server数据库的安装

    由于工作需要出一版教程,记录一下安装过程,用到的数据库是SQL Server2014版本 下载地址为:SQL Server2014下载 提取码:6666 下载好安装包,首先右键,装载 装载完, 会有这 ...

  4. C#中的记录(record)

    从C#9.0开始,我们有了一个有趣的语法糖:记录(record) 为什么提供记录? 开发过程中,我们往往会创建一些简单的实体,它们仅仅拥有一些简单的属性,可能还有几个简单的方法,比如DTO等等,但是这 ...

  5. Hadoop Jobhistory配置启用

    Hadoop Jobhistory记录下已运行完的MapReduce作业信息并存放在指定的HDFS目录下, 默认情况下是没有启动的,需要配置完后手工启动服务. 1.修改hadoop的配置文件mapre ...

  6. Kafka基础教程(二):Kafka安装

    因为kafka是基于Zookeeper的,而Zookeeper一般都是一个分布式的集群,尽管kafka有自带Zookeeper,但是一般不使用自带的,都是使用外部安装的,所以首先我们需要安装Zooke ...

  7. Kafka和RabbitMQ有哪些区别,各自适合什么场景?

    经常有人问我 有个 xx 需求,我应该用 Kafka 还是 RabbitMQ ? 这个问题很常见,而且很多人对二者的选择也把握不好. 所以我决定写篇文章来详细说一下:Kafka 和 RabbitMQ ...

  8. POJ 2442 Sequence堆 优先队列

    题目描述 给定m个序列,每个序列包含n个非负整数.现在我们可以从每个序列中选择一个数字以形成一个具有m个整数的序列.显然,我们可以得到n ^ m种这种序列.然后,我们可以计算每个序列中的数字总和,并获 ...

  9. 初识python:time 模版

    语法及示例代码如下: import time # time 时间戳,1970年到当前时间的秒数 print('time:',time.time()) # sleep 延时.睡眠(s) print('s ...

  10. 记一次ARM服务器(鲲鹏920)的PXE批量装机遇到的坑

    由于近期项目需要,在对一批华为鲲鹏920的ARM服务器(型号为天宫TG225 B1)进行批量装机的过程中,遇到了各种各样千奇百怪的bug(换个高情商的说法就是遇到了各种各样和x86服务器不一样的地方) ...