• 题解

    • 需要先说明一点东西:
    • 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. python-两个筛子数据可视化(直方图)

    """ 作者:zxj 功能:模拟掷骰子,两个筛子数据可视化 版本:3.0 日期:19/3/24 """ import random impo ...

  2. Python20-Day06

    常用模块 一.random模块 import random # print(random.random()) #打印0-1之间的小数 # print(random.randint(1,3)) #大于等 ...

  3. 通过exp命令对Oracle数据库进行备份操作(提供两种情况的备份:备份本地,备份远程的数据库)

    exp 用户名/密码@数据库所在ip地址:数据库端口号/数据库的service-name file=存储到的位置 这个是能成功的 http://www.2cto.com/database/201402 ...

  4. Scrum Meeting 11.10

    成员 今日任务 明日计划 用时 徐越  调试前端代码 协助重构UI,完善前端逻辑  2h  赵庶宏 调出不能显示回答列表的bug,是后端数据库建库问题 与前一组进行数据库统一  3h  薄霖 UI代码 ...

  5. 20135337朱荟潼Java实验报告二

    20135337朱荟潼 实验二 Java面向对象程序设计 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L ...

  6. WPF四则运算《《《《《策略模式

    设计思路:           因为之前没有用过WPF,听说和window窗体语法类似,就想着仿照之前的Window窗体做的,首先用三个textbox存储数据,添加一个comboBox,利用索引选择运 ...

  7. Leetcode题库——20.有效的括号

    @author: ZZQ @software: PyCharm @file: IsValid.py @time: 2018/9/16 20:20 要求: 给定一个只包括 '(',')','{','}' ...

  8. PAT 1053 住房空置率

    https://pintia.cn/problem-sets/994805260223102976/problems/994805273284165632 在不打扰居民的前提下,统计住房空置率的一种方 ...

  9. Java多线程(四) —— 线程并发库之Atomic

    一.从原子操作开始 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始). 很多情况下 ...

  10. struts 类型转换