• 题解

    • 需要先说明一点东西:
    • 1

      • 同一副对角线方向相同,共有$gcd(n,m)$条不同的副对角线,机器人的行为是一个$gcd(n,m)$的循环;;
      • 如果左上方是$(1,1)$,容易看出所有的路径是从左或上面连向右或下面并且紧密排列,所以所有副对角线上方向相同;
      • 有些副对角线是间隔开的只需要将网格重复几次,那么一条副对角的特征就可以用$x+y+kn+km$
      • 由斐蜀定理可知一共有$gcd(n,m)$条;
      • 并且每次一定是从一条对角线$x$走向对角线$x+1$,所以循环节为$gcd(n,m)$
    • 2

      • $n*m$的一种矩形,记$d=gcd(n,m)$,$d_{x}$为$d$步中向下走的步数,$d_{y}$为向右走的步数,一种方案合法当且仅当$$d_{x}+d_{y}=d$, gcd(d_{x},n)=gcd(d_{y},m)=1$$
      • 2.1 充分性:

      • 考虑一个格子在不同的循环节内的位置:$(x+kd_{x} , y+kd_{y})$
      • 由于$gcd(d_{x},n)=gcd(d_{y},m)=1$,所以$x$的循环节长度是$n$,$y$的循环节长度是$m$,同时循环节内元素互不相同,所以$(x,y)$的循环节长度是$lcm(n,m)$
      • 所以棋盘一定会被分成$\frac{nm}{lcm(n,m)} = gcd(n,m)$个类;
      • 考虑在同一个循环节内的不同位置:$(x_{i},y_{i})$和$(x_{j},y_{j})$
      • 记$\delta x  = abs(x_{i}-x_{j}) , \delta y = abs(y_{i}-y_{j}) $
      • 必有$\delta x < d_{x} \ || \ \delta y < d_{y} $发生,所以$(x_{i},y_{i})$和$(x_{j},y_{j})$一定不同类;
      • 由于$d_{x}+d_{y}=d$,所以这就有了所以$d$个类即可以将棋盘完全覆盖;
      • 2.2 必要性:

      • 由斐蜀定理可知在任意$gcd$不为$1$的时候有些坐标是没法表示的,所以肯定也走不到;
    • 现在可以求方案了,考虑如何求步数和:
    • 枚举满足的$d_{x}$和$d_{y}$
    • 枚举撞到障碍的轮数$l$,得到起点$(x_{l},y_{l})$;
    • 可以将前$l$轮和前$l-1$的障碍全部分别映射到$(x_{l},y_{l}) , (x_{l}+d_{x}+1,y_{l}+d_{y}+1)$的矩形中;
    • 现在需要找到每一条在前$l-1$轮不停下在$l$轮停下的路径;
    • 枚举第$l$轮的障碍,前$l$轮图上从起点到最后一个非障碍点的路径 *前$l-1$图上 障碍点到终点的路径即可;
    • 分别在出处理好的前$l$和前$l-1$的图上做两个普通路径计数$dp$即可;
  •  #include<bits/stdc++.h>
    #define mod 998244353
    using namespace std;
    const int N=;
    int n,m,mp[][N][N],f[][N][N],ans;
    char s[N][N];
    void upd(int&x,int y){x+=y;if(x>=mod)x-=mod;}
    int gcd(int a,int b){return !b?a:gcd(b,a%b);}
    int main(){
    #ifndef ONLINE_JUDGE
    freopen("T2.in","r",stdin);
    freopen("T2.out","w",stdout);
    #endif
    int T;scanf("%d",&T);
    while(T--){
    ans=;
    scanf("%d%d",&n,&m);
    for(int i=;i<=n;++i)scanf("%s",s[i]+);
    for(int i=;i<=n<<;++i)
    for(int j=;j<=m<<;++j)s[i][j]=s[(i-)%n+][(j-)%m+];
    int d=gcd(n,m),cur=;
    for(int dx=,dy;dx<=d;++dx){
    dy=d-dx;
    if(gcd(dx,n)!=||gcd(dy,m)!=)continue; for(int i=;i<=dx+;++i)
    for(int j=;j<=dy+;++j)
    mp[][i][j]=mp[][i][j]=; for(int l=,ax=,ay=;l<=n*m/d;++l){ cur^=; for(int i=;i<=dx+;++i)
    for(int j=;j<=dy+;++j)
    mp[cur][i][j]=mp[cur^][i][j]|(s[ax+i-][ay+j-]-''); for(int i=;i<=dx+;++i)
    for(int j=;j<=dy+;++j)f[][i][j]=f[][i][j]=; if(!mp[cur][][]){
    f[cur][][]=;
    for(int i=;i<=dx+;++i)
    for(int j=;j<=dy+;++j){
    if(i!=dx+&&!mp[cur][i+][j])upd(f[cur][i+][j],f[cur][i][j]);
    if(j!=dy+&&!mp[cur][i][j+])upd(f[cur][i][j+],f[cur][i][j]);
    }
    } if(!mp[cur^][dx+][dy+]){
    f[cur^][dx+][dy+]=;
    for(int i=dx+;i;--i)
    for(int j=dy+;j;--j){
    if(i!=&&!mp[cur^][i-][j])upd(f[cur^][i-][j],f[cur^][i][j]);
    if(j!=&&!mp[cur^][i][j-])upd(f[cur^][i][j-],f[cur^][i][j]);
    }
    } for(int i=;i<=dx+;++i)
    for(int j=;j<=dy+;++j)if(mp[cur][i][j]){
    int x=;
    if(i!=)upd(x,f[cur][i-][j]);
    if(j!=)upd(x,f[cur][i][j-]);
    int y = f[cur^][i][j];
    upd(ans, 1ll*((l-)*d+i+j-)*x%mod*y%mod);
    } ax=(ax+dx-)%n+,ay=(ay+dy-)%m+; }
    }
    printf("%d\n",ans);
    }
    return ;
    }

LGP4588[JSOI2018]扫地机器人的更多相关文章

  1. 【BZOJ5318】[JSOI2018]扫地机器人(动态规划)

    [BZOJ5318][JSOI2018]扫地机器人(动态规划) 题面 BZOJ 洛谷 题解 神仙题.不会.... 先考虑如果一个点走向了其下方的点,那么其右侧的点因为要被访问到,所以必定只能从其右上方 ...

  2. [LeetCode] Robot Room Cleaner 扫地机器人

    Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or blocked. Th ...

  3. Hihocoder 1275 扫地机器人 计算几何

    题意: 有一个房间的形状是多边形,而且每条边都平行于坐标轴,按顺时针给出多边形的顶点坐标 还有一个正方形的扫地机器人,机器人只可以上下左右移动,不可以旋转 问机器人移动的区域能不能覆盖整个房间 分析: ...

  4. Java实现第十届蓝桥杯JavaC组第十题(试题J)扫地机器人

    扫地机器人 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 [问题描述] 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示. 走廊内部署了 K 台扫地机器人 ...

  5. [LeetCode] 489. Robot Room Cleaner 扫地机器人

    Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or blocked. Th ...

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

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

  7. 489. Robot Room Cleaner扫地机器人

    [抄题]: Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or block ...

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

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

  9. 「JSOI2018」机器人

    在本题当中为了方便,我们将坐标范围改至 \((0 \sim n - 1, 0 \sim m - 1)\),行走即可视作任意一维在模意义下 \(+1\). 同时,注意到一个位置只能经过一次,则可以令 \ ...

随机推荐

  1. openstack系列文章(一)

    学习openstack的系列文章-虚拟化 虚拟化 KVM CPU 虚拟化 KVM 内存虚拟化 全虚拟化 I/O 设备 半虚拟化 I/O 设备 I/O PCI PCIe 设备直接分配 SR-IOV 在 ...

  2. 10款常见MySQL高可用方案选型解读

    一.概述 我们在考虑MySQL数据库的高可用架构时,主要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断. ...

  3. 20162314 《Program Design & Data Structures》Learning Summary Of The Fifth Week

    20162314 2017-2018-1 <Program Design & Data Structures>Learning Summary Of The Fifth Week ...

  4. 使用exe4j将jar包导出为exe

    Exe4J使用方法 此工具是将Java程序包装成exe格式文件工具.(点击exe4j\bin\exe4j.exe文件)启动后如下图所示 如果未注册,则可使用这个注册码:A-XVK209982F-1y0 ...

  5. java 面试 -- 4

    Java面试知识点总结   本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺(阅读本文需要有 ...

  6. 软工实践-Beta 冲刺 (6/7)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...

  7. 45度炸队Alpha冲刺博客集

    博客集如下: Alpha冲刺Day1:第一天冲刺记录 Alpha冲刺Day2:第二天冲刺记录 Alpha冲刺Day3:第三天冲刺记录 Alpha冲刺Day4:第四天冲刺记录 Alpha冲刺Day5:第 ...

  8. [建树(非二叉树)] 1106. Lowest Price in Supply Chain (25)

    1106. Lowest Price in Supply Chain (25) A supply chain is a network of retailers(零售商), distributors( ...

  9. SQL语句中 chinese_prc_CS_AI_WS 以及replace用法

          Select * from [DBData].[dbo].[T_Student] where Name='lilei'    查询结果如下:   结论:由查询结果可知 SQL Server ...

  10. 开发 | 如何在微信小程序的页面间传递数据?

    我们在之前发布过小程序页面传值方法的简单介绍,说明了在小程序开发中,两种常见的页面之间传值方法. 本期,知晓程序(微信号 zxcx0101)为你带来的是「倒数记日」小程序开发者带来的,小程序开发中,有 ...