在本题当中为了方便,我们将坐标范围改至 \((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. Codeforces 1113C: Sasha and a Bit of Relax(位运算|异或)

    time limit per test: 1 secondmemory limit per test: 256 megabytesinput: standard inputoutput: standa ...

  2. Chapter 15 Outcome Regression and Propensity Scores

    目录 15.1 Outcome regression 15.2 Propensity scores 15.3 Propensity stratification and standardization ...

  3. Order Statistic

    目录 The Order Statistic 引理1 的一些基本性质 顺序统计量的分布 顺序统计量的条件分布 特殊分布的特殊性质 Order Statistic The Order Statistic ...

  4. 分享一个自研开发的QA自动化审计工具-Sonar检查

    评价一个系统或软件的质量高低,我始终认为除了需求和设计外,代码质量很重要,一个高质量的系统或软件,并不是被测试出来的,更多的是要靠设计和开发出来的.目前也有很多自动化的测试工具,更多的是从功能和性能角 ...

  5. MongoDB分片集群机制及原理

    1. MongoDB常见的部署架构 * 单机版 * 复制集 * 分片集群 2. 为什么要使用分片集群 * 数据容量日益增大,访问性能日渐下降,怎么破? * 新品上线异常火爆,如何支撑更多用户并发? * ...

  6. SpringBoot 之 控制器层

    @Controller public class EmployeeController { @Autowired EmployeeDao employeeDao; @Autowired Departm ...

  7. Pytest_常用执行参数详解(3)

    前面讲了测试用例的执行方式,也认识了 -v  -s 这些参数,那么还有没有其它参数呢?答案肯定是有的,我们可以通过 pytest -h来查看所有可用参数. 从图中可以看出,pytest的参数有很多,但 ...

  8. Python_多任务:进程、线程、协程

    进程 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体.进程是一种抽象的概念,从来没有统一的标准定义.进程一般由程序 ...

  9. [网络编程] 自己构建一个cgi.FieldStorage()的对象

    问题描述: 通常cgi.FieldStorage()返回一个类似于Python字典的对象. 在cgi框架中必须通过浏览器发送表单过来才能接受消息 那么我该怎么进行本地调试呢? 或者说在没有搭建好一整套 ...

  10. Linux上天之路(三)之Linux系统目录

    1. Linux设计思想 1) 程序应该小而专一,程序应该尽量的小,且只专注于一件事上,不要开发那些看起来有用但是90%的情况都用不到的特性: 2) 程序不只要考虑性能, 程序的可移植性更重要,she ...