[Luogu4558] [LOJ2550]


\(19.3.25\)

JSOI2018简要题解 - FallDream

规律就是

对于\(n=m\)我们每一条左下到右上的对角线上的点的走法都是一样的且每\(n\)步一个轮重复

对于\(n!=m\)我们找到最大公约数\(d\),在每个\(d∗d\)的方格里满足左上到右下的对角线点的走法一样且\(d\)轮一个重复

然后枚举\(dx,dy=d−dx\),我们要满足\(gcd(n,dx)==1且gcd(m,dy)==1\)这时是一个合法路径

显然有一些点是必须要经过的,我们把这些点遍历一遍,同时算出\(fir[i][j]\)表示向下走\(i\)和向右走\(j\)最早第几次走到障碍

然后我们进行一下\(dp\),就是对于一个点\(i,j\),要它恰好第\(k\)轮撞到障碍物的话,我们需要到达\((i,j)\)之前的点轮数都大于\(k\),之后的点都大于等于\(k\)

然后对于每个\(fir[i][j]==k\)的点统计一下就好了

代码


\(19.3.30\)

关于这道题的找规律 : 首先对于这种循环或者矩形上的操作可以先考虑正方形 ,

发现对于\(3*3\)的正方形一定是横竖分别走1步和2步才能回到原点 ;但这太小了

对于\(5*5\)的正方形除了\(1\)步和\(4\)步还有\(2\)步和\(3\)步 , 而\(4*4\)的正方形却不能是\(2\)步和\(2\)步

猜一个结论 : 必须是互质的 , 否则不兼容; 更细心还可以发现 , 循环的步数还必须是\(n\) ; 不然有些点就会走不到或者提前撞到 , 即不会走满

猜测正方形嵌套到长方形里面会怎么样 , 发现这时每个块里的线的形状都是一样的 .

为什么会这样呢 ? 也许这时正方形的排布也要满足长和宽互质 , 否则不兼容 .

只有互质的 , 才是兼容的 , 才能跑满跑完 .

所以要找到\(d=gcd(n,m)\) , 分成\(d*d\)的正方形去做

而对于循环内的顺序却是不重要的

然后就是\(DP\)了 , \(DP\)也很巧妙

在一组合法的循环方案中 , 设\(fir[x][y]\)表示\((x,y)\)这个点在第几轮会第一次撞到 ,

然后要统计第\(k\)轮撞到\((x,y)\)的方案数 , 考虑这个就可以只用看这个循环的正方形了

可以发现一条路径如果撞上\((x,y)\) , \((x,y)\)之前的经过点都必须满足\(fir[i][j]>fir[x][y]\) , 在\((x,y)\)之后的经过点都必须满足\(fir[i][j]>=fir[x][y]\)

从左上往右下 , 从右下往左上分别做\(DP\)就好了


\(19.4.4\)

枚举自己的状态 , 考虑前面和后面要满足的条件 , 参考[LnOI2019]加特林轮盘赌

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
} const int N=55;
const int mod=998244353;
int fir[N][N],f[N][N],g[N][N];
char s[N][N];
int n,m,P,T,ans; inline int add(int x,int y){x+=y;return x>=mod?x-mod:x;}
inline int mul(LL x,int y){x*=y;return x>=mod?x%mod:x;}
inline int gcd(int x,int y){return y?gcd(y,x%y):x;} inline int solve(){
n=read(),m=read(),P=gcd(n,m),T=n*m/P;
ans=0;
for(int i=0;i<n;i++) scanf("%s",s[i]);
for(int tx=0,ty=P;tx<=P;tx++,ty--) if(gcd(tx,n)==1&&gcd(ty,m)==1){
memset(fir,0x3f,sizeof fir);
for(int i=1,stx=0,sty=0;i<=T;i++,(stx+=tx)%=n,(sty+=ty)%=m){
for(int dx=0;dx<=tx;dx++) for(int dy=0;dy<=ty;dy++)
if(s[(stx+dx)%n][(sty+dy)%m]=='1') fir[dx][dy]=min(fir[dx][dy],i);
}
for(int t=1;t<=T;t++){
memset(f,0,sizeof f);memset(g,0,sizeof g);
f[0][0]=1,g[tx][ty]=1;
for(int i=0;i<=tx;i++)
for(int j=0;j<=ty;j++){
if(i&&fir[i-1][j]>t) f[i][j]=add(f[i][j],f[i-1][j]);
if(j&&fir[i][j-1]>t) f[i][j]=add(f[i][j],f[i][j-1]);
}
for(int i=tx;i>=0;i--)
for(int j=ty;j>=0;j--){
if(i<tx&&fir[i+1][j]>=t) g[i][j]=add(g[i][j],g[i+1][j]);
if(j<ty&&fir[i][j+1]>=t) g[i][j]=add(g[i][j],g[i][j+1]);
}
for(int i=0;i<=tx;i++){
for(int j=0;j<=ty;j++) if((i+j)>=0&&fir[i][j]==t)
ans=add(ans,mul((t-1)*P+i+j,mul(f[i][j],g[i][j])));
}
}
}
return ans;
} int main(){
for(int i=read();i;i--) printf("%d\n",solve());
}

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

  1. [LnOI2019]加特林轮盘赌

    Luogu5249 轮流开枪打一个环上的人 , 每次\(p\)的概率打死 , \(p\)始终相同 , 从第\(1\)个人开始 , 求第\(k\)个人成为唯一幸存者的概率 \(19.3.30\) 官方题 ...

  2. DP小小结

    入门题 : [Luogu1441]砝码称重 , [NOIP2015]子串 [AHOI2009]中国象棋 , 详见代码 [HNOI2007]梦幻岛宝珠 , 详见代码 [NOIP2012]开车旅行 , 没 ...

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

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

  4. LGP4588[JSOI2018]扫地机器人

    题解 需要先说明一点东西: 1 同一副对角线方向相同,共有$gcd(n,m)$条不同的副对角线,机器人的行为是一个$gcd(n,m)$的循环:: 如果左上方是$(1,1)$,容易看出所有的路径是从左或 ...

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

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

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

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

  7. 「JSOI2018」机器人

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

  8. JSOI2018简要题解

    来自FallDream的博客,未经允许,请勿转载,谢谢. 有幸拜读到贵省的题目,题的质量还不错,而且相比zjoi可做多了,简单发一下题解吧. 还有就是,怎么markdown在博客园上的代码这么丑啊 「 ...

  9. 【翻译】用AIML实现的Python人工智能聊天机器人

    前言 用python的AIML包很容易就能写一个人工智能聊天机器人. AIML是Artificial Intelligence Markup Language的简写, 但它只是一个简单的XML. 下面 ...

随机推荐

  1. ros console_bridge找不到

    Could not find a package configuration file provided by "console_bridge" with any of the f ...

  2. 让你大开眼界的10款Android界面设计

    根据调查显示, iOS与Android的市场份额差距正越来越大.Android设备正在成为手机应用市场的主力军.如何从设计层面创造一个优美的app界面来吸引用户已然成为广大App开发者们必做的功课之一 ...

  3. Part2_lesson2---ARM处理器工作模式

    arm公司发布的学习手册:ARM Architecture Reference Manual. 打开之: 找到Programmers' Model->A2.2 Processor modes. ...

  4. QT学习之常用类的总结

    QApplication 应用程序类 管理图形用户界面应用程序的控制流和主要设置       QPalate   QLabel 标签类 提供文本或者图像的显示   QPushButton 按钮类 提供 ...

  5. (3)WePHP控制器与模型

    MVC的先进理念就是程序流程 数据库操作 模板制作三个流程分离 大M函数会把模型引入到当前控制器的方法中,注意这个"excel"对应M文件夹的excel.php 同时也是整个exc ...

  6. HDU 4756 Install Air Conditioning (MST+树形DP)

    题意:n-1个宿舍,1个供电站,n个位置每两个位置都有边相连,其中有一条边不能连,求n个位置连通的最小花费的最大值. 析:因为要连通,还要权值最小,所以就是MST了,然后就是改变一条边,然后去找出改变 ...

  7. javascript的事件冒泡【转】

    出处:http://www.cnblogs.com/sanshi/archive/2009/02/18/1393165.html (感谢三生石上) 这是一个基础性的文章,使用Javascript观察D ...

  8. 第02章 查询DSL进阶

    本章内容 Lucene默认评分公式是如何工作的. 什么是查询重写. 查询二次评分是如何工作的. 如何在单次请求中实现批量准实时读取操作. 如何在单次请求中发送多个查询. 如何对包括嵌套文档和多值字段的 ...

  9. var 在linq中的使用

    一:掌握linq,写出超炫的代码 1. var关键字 [隐式类型] 隐式类型 和 匿名类型的不同叫法. 特性 和 属性 2.隐式类型 就是让编译器来推断的一种语法糖. 二:隐式类型的应用场景 1. 简 ...

  10. C# 字符,字符串和文本处理。

    1. 字符: 在.net中 字符是表示成16为Unicode代码值.每个字符都是System.Char结构(一个值类型)的实例. public class StringTempte { public ...