在本题当中为了方便,我们将坐标范围改至 \((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调用Prometheus监控数据并计算

    Prometheus是什么 Prometheus是一套开源监控系统和告警为一体,由go语言(golang)开发,是监控+报警+时间序列数 据库的组合.适合监控docker容器.因为kubernetes ...

  2. FineGAN

    目录 概 主要内容 隐变量 背景 轮廓 色彩和纹理 用于无监督分类 代码 Singh K., Ojha U. & Lee Y. FineGAN: Unsupervised Hierarchic ...

  3. JDK HttpClient 多重请求-响应的处理

    HttpClient 多重请求-响应的处理 目录 HttpClient 多重请求-响应的处理 1. 简述 2. 请求响应流程图 3. 用户请求的复制 4. 多重请求处理概览 5. 请求.响应过滤的执行 ...

  4. Java EE数据持久化框架 • 【第4章 MyBatis动态SQL】

    全部章节   >>>> 本章目录 4.1 MyBatis动态标签 4.1.1  MyBatis动态标签介绍 4.1.2 < if >标签 4.1.3 update语 ...

  5. x86-2-保护模式

    x86-2-保护模式 操作系统负责计算机上的所有软件和硬件的管理,它可以百分百操作计算机的所有内容.但是,操作系统上编写的用户程序却应当有所限制,只允许用户程序访问属于自己程序的内容,不然整个生态就很 ...

  6. emqx的一个配置参数

    这个参数尝试改为internal后,所有用户都可以匿名登录

  7. Azure Terraform(九)GitHub Actions 实现 Infra 资源的自动化部署

    思路浅析 使用 Terraform Code 部署 Azure 基础设施资源是特别受欢迎的,我曾经有写文章分享过利用 Azure DevOps 自动部署 Terraform Code 所描述的 Azu ...

  8. Vue-cli代理解决跨域问题

    使用vue-cli调接口的时候,总是会出现垮与问题,因为vue的localhost与访问域名不一致导致.而这一点,开发者显然也想到了,故而在vuejs-templates,也就是vue-cli的使用的 ...

  9. Spring Security 接口认证鉴权入门实践指南

    目录 前言 SpringBoot 示例 SpringBoot pom.xml SpringBoot application.yml SpringBoot IndexController SpringB ...

  10. access注入 - 联合查询

    1.access数据库简介 简介:Microsoft Office Access是由微软发布的关系数据库管理系统.它结合了 MicrosoftJet Database Engine 和 图形用户界面两 ...