游乐园
时间限制: 1 Sec 内存限制: 128 MB
题目描述
今天是个好日子,小A和他的小伙伴们一起去逛游乐园。这时,游乐园中忽然出现了一个伪装的吸血鬼,小A和他的小伙伴们都惊呆了!小伙伴们马上跑向了游乐园的四面八方。当“吸血鬼”回家吃饭的时候,小A才发现他已经和他的小伙伴们走散了。小A是个路痴,所以他只好站在原地等小伙伴们回来。
我们可以将游乐园视为一个N行M列的矩形,最上面一行为第1行,最左边一列为第1列。每个小伙伴手里都有一张神奇的地图,地图中对应着游乐园的每行每列都有一个写着0-9中某个数字的路标。小A的K位小伙伴们每一秒都会依次进行以下行动:
1.读取他所在的位置上的路标X;
2.顺时针旋转90度X次;
3.如果他面对游乐园外,那就他会再转180度;
4.移动到他面对的位置。
小A的视力很糟糕。只有当所有的小伙伴都同时出现在他所在的位置时,他才能和他的小伙伴们团聚。小A等得很心急,所以他求助于你。请你告诉他,他和小伙伴们团聚所需要的时间。
输入
输入的第一行包括正整数N、M和K。
输入的第二行包括正整数X和Y,代表小A的位置。
输入的其他行将分别描述K个小伙伴:
·两个正整数Xi,Yi,代表第i个小伙伴开始时所在的位置。字符Ci,代表该小伙伴开始时面对的方向(U为上,R为右,D为下,L为左);
·由0-9(含)组成的N×M的地图,其中第x行第y列的数字表示该小伙伴地图上(x, y)的位置上的路标。
输出
唯一的一行输出小A和小伙伴们团聚所需要的时间。如果小A和他的小伙伴们永远不会团聚,请输出-1。
样例输入
3 3 1
2 2
1 1 R
010
000
000

3 4 2
2 2
3 4 R
2327
6009
2112
3 2 R
1310
2101
1301

4 4 3
4 3
1 1 U
1001
0240
3322
2327
1 3 L
9521
2390
3020
2421
2 2 D
3397
2013
1102
7302
样例输出
3

8

296
提示
【数据范围】
对于30%的数据,如果小A和他的小伙伴们能够团聚,团聚的总秒数小于10^6;
对于70%的数据,3<=N, M<=40;
对于100%的数据,3<=N, M<=50,1<=K<=5如果小A和他的小伙伴们能够团聚,团聚的总秒数小于10^18。
题解:
在扯这道题之前,先扯一波中国剩余定理。
科普时间:
一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》卷下第二十六题,叫做“物不知数”问题,原文如下:
有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。《孙子算经》中首次提到了同余方程组问题,以及以上具体问题的解法,因此在中文数学文献中也会将中国剩余定理称为孙子定理。
正题:
问题描述:用数学的语言来说,就是给定nnn个方程x" role="presentation" style="position: relative;">xxx%ai=biai=bia_i=b_i,求xxx的最小正整数解。
构造:当ai" role="presentation" style="position: relative;">aiaia_i两两互质时,我们可以构造出x。
令M=∏ni=1aiM=∏i=1naiM=\prod_{i=1}^na_i,如果xxx是一个解,则x+M" role="presentation" style="position: relative;">x+Mx+Mx+M也是一个合法的解,反之亦然。
令Mi=∏nj=1,j≠iajMi=∏j=1,j≠inajM_i=\prod_{j=1,j\ne i}^na_j,M−1iMi−1M_i^{-1}表示MiMiM_i关于aiaia_i的逆元。
则x=∑ni=1biMiM−1ix=∑i=1nbiMiMi−1x=\sum_{i=1}^nb_iM_iM_i^{-1}%MMM。
接下来证明x" role="presentation" style="position: relative;">xxx的确是方程组的一个解。
对于第iii个方程,当j=i" role="presentation" style="position: relative;">j=ij=ij=i时,bjMjM−1jbjMjMj−1b_jM_jM_j^{-1}%ai=biai=bia_i=b_i。
当j≠ij≠ij\ne i时,MjMjM_j%ai=0ai=0a_i=0,因此bjMjM−1jbjMjMj−1b_jM_jM_j^{-1}%ai=0ai=0a_i=0。
所以xxx%ai=bi" role="presentation" style="position: relative;">ai=biai=bia_i=b_i成立。
那么不互质的情况呢?
不妨假设我们要解方程xxx%a1=b1" role="presentation" style="position: relative;">a1=b1a1=b1a_1=b_1和xxx%a2=b2" role="presentation" style="position: relative;">a2=b2a2=b2a_2=b_2。
则x=k1a1+b1=k2a2+b2x=k1a1+b1=k2a2+b2x = k_1a_1 + b_1 = k_2a_2 + b_2。
化简得k1a1−k2a2=b2−b1k1a1−k2a2=b2−b1k_1a_1-k_2a_2=b_2-b_1,利用exgcdexgcdexgcd求出xxx的一个解r" role="presentation" style="position: relative;">rrr。
那么xxx%lcm(a1,a2)=r" role="presentation" style="position: relative;">lcm(a1,a2)=rlcm(a1,a2)=rlcm(a_1,a_2)=r。
对于更多的方程,一一合并即可。
好,开始扯游乐园这道题了。
首先裂点,将每一个点拆分成444个,分别表示不同的朝向。
可以发现每个人走的路径存在循环节,且为一个ρ" role="presentation" style="position: relative;">ρρρ形循环。
枚举每一个人到达终点时的朝向,设环的大小为lenilenilen_i,第一次到达该点的时刻为titit_i。
若该点不在环上,则答案必须为titit_i,否则答案为k∗leni+tik∗leni+tik*len_i+t_i。
用中国剩余定理求解即可。
Code:Code:Code:

#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 60
#define ll long long
#define INF 100000000000000000
using namespace std;
ll n,m,k,x1,y1,a[N][N],b[6][4],c[6][4],d[6],f[N][N][4],ans=INF;
void work(ll &x,ll &y,ll &z)
{ (z+=a[x][y])%=4; if(x==1&&z==0)z=2; if(y==1&&z==3)z=1; if(x==n&&z==2)z=0; if(y==m&&z==1)z=3; if(z==0)x--; if(z==1)y++; if(z==2)x++; if(z==3)y--;
}
void exgcd(ll a,ll b,ll &x,ll &y)
{ if(b==0) { x=1,y=0;return; } exgcd(b,a%b,x,y); ll t=x;x=y;y=t-a/b*y;
}
ll getans(ll len1,ll st1,ll len2,ll st2)
{ ll a=len1,b=-len2,c=st2-st1,x=0,y=0; if(len1==0&&len2==0) if(st2==st1)return st2;else return INF; if(len1==0) if(b>c&&c%b==0) return max(st1,st2);else return INF; if(len2==0) if(c>a&&c%a==0) return max(st1,st2);else return INF; if(len1==len2) if(abs(st2-st1)%len1==0) return max(st1,st2);else return INF; ll g=__gcd(a,b); if(c%g!=0)return INF; exgcd(a,b,x,y); c/=g;x*=c; b=abs(b);b/=g; if(x<0)x=(b+x%b); x%=b; return st1+len1*x;
}
void find(ll x)
{ if(x>k) { ll st[6],len[6]; for(int i=1;i<=k;i++) st[i]=b[i][d[i]],len[i]=c[i][d[i]]; if(k==1) { ans=min(ans,st[1]); return; } for(int i=1;i<=k-1;i++) { st[i+1]=getans(len[i],st[i],len[i+1],st[i+1]); if(__gcd(len[i],len[i+1])==0)len[i+1]=0; else len[i+1]=len[i]*len[i+1]/__gcd(len[i],len[i+1]); } ans=min(ans,st[k]); } for(int i=0;i<=3;i++)  if(b[x][i]!=0)d[x]=i,find(x+1);
}
int main()
{ scanf("%lld%lld%lld",&n,&m,&k);  scanf("%lld%lld",&x1,&y1); for(int l=1;l<=k;l++) { char ch;ll x,y,z,ring,_ring; scanf("%lld %lld %c",&x,&y,&ch); if(ch=='U')z=0; if(ch=='R')z=1; if(ch=='D')z=2; if(ch=='L')z=3; for(int i=1;i<=n;i++) { char ch[105]; scanf("%s",ch); for(int j=1;j<=m;j++) a[i][j]=ch[j-1]-48; }  memset(f,0,sizeof(f)); for(int i=0;i<=3;i++)b[l][i]=0; for(int i=1;;i++) if(!f[x][y][z]) { f[x][y][z]=i; if(x==x1&&y==y1)b[l][z]=i; work(x,y,z); }else{ ring=i-f[x][y][z]; _ring=f[x][y][z]; break; } for(int i=0;i<=3;i++) if(b[l][i]>=_ring)c[l][i]=ring; else c[l][i]=0; } find(1); if(ans==INF)ans=-1; printf("%lld",ans);
}

游乐园(中国剩余定理)相关推荐

  1. 中国剩余定理(孙子定理)的证明和c++求解

    <孙子算经>里面的"物不知数"说的是这样的一个题目:一堆东西不知道具体数目,3个一数剩2个,5个一数剩3个,7个一数剩2个,问一共有多少个. 书里面给了计算过程及答案: ...

  2. 解题报告(十三)中国剩余定理(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  3. 中国剩余定理(Chinese Remainder Theorem)

    中国剩余定理 民间传说着一则故事--"韩信点兵". 秦朝末年,楚汉相争.一次,韩信将1500名将士与楚王大将李锋交战.苦战一场,楚军不敌,败退回营,汉军也死伤四五百人,于是韩信整顿 ...

  4. 【中国剩余定理】POJ 1006 HDU 1370 Biorhythms

    题目链接: http://poj.org/problem?id=1006 http://acm.hdu.edu.cn/showproblem.php?pid=1370 题目大意: (X+d)%23=a ...

  5. 中国剩余定理matlab非互质,中国剩余定理模板(互质版和非互质版)

    互质版: #include #include #include using namespace std; typedef __int64 int64; int64 a[15],b[15]; int64 ...

  6. POJ2891 Strange Way to Express Integers【扩展中国剩余定理】

    题目大意 就是模板...没啥好说的 思路 因为模数不互质,所以直接中国剩余定理肯定是不对的 然后就考虑怎么合并两个同余方程 \(ans = a_1 + x_1 * m_1 = a_2 + x_2 * ...

  7. 韩信点兵-中国剩余定理(练习)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=34提交地址 韩信点兵-中国剩余定理. 题目能够用枚举非常easy的做出来,在这里写是为了运用一下刚刚 ...

  8. hdu 3579(中国剩余定理非互质)

    解题思路:这道题目因为不一定是互质的,所以直接套用中国剩余定理肯定是错的,,这里采用的是非互质的方法...之前的博客上面有详细的证明过程和算法,这里就不罗嗦了..但是这道题目在输出的时候有特定的要求, ...

  9. hdu 1573(中国剩余定理非互质情况)

    解题思路:这道题目有可能a[i],两两不互质,所以直接用中国剩余定理肯定是不对的..这里考虑非互质的情况 问题描述:给出bi,ni的值,且n1, n2, n3,-, ni两两之间不一定互质,求Res的 ...

最新文章

  1. mysql常用日期时间函数_MySql常用日期时间函数
  2. PHP基础系列之正则表达式(一)
  3. Self-reflection for career
  4. 分割平面、空间问题 数学公式
  5. Spring-级联赋值
  6. 【Linux】一步一步学Linux——Centos7.5安装图解(08)
  7. 将Wiremock集成到Spring Boot Java Web应用程序中以模拟外部依赖关系
  8. leetcode 218. 天际线问题
  9. 网络编程项目(聊天室项目)
  10. android输入自动补全,Android用户输入自动提示控件AutoCompleteTextView使用方法
  11. 简单示例用例(Simple Example Use Cases)--hive GettingStarted用例翻译
  12. 网页自动跳转 5种方法
  13. SQL Server 2008 示例库 AdventureWorks2008R2
  14. 人类一败涂地服务器不稳定,人类一败涂地崩溃怎么办 人类一败涂地游戏崩溃解决方法一览_游侠网...
  15. IOS 13陀螺仪监控
  16. 宝塔面板的数据库地址配置
  17. Lazada商家售出产品多久能收款?收款方式及流程一篇详解!
  18. c语言输出方框□怎么回事_C语言打印数据的二进制格式-原理解析与编程实现
  19. 棋盘覆盖问题C++求解
  20. ES 索引创建及查询

热门文章

  1. css 数字滚动效果
  2. UINO优锘:DMV产品绘图篇:数据驱动自动绘制 让IT架构图准确可信
  3. 00后阿里P6晒出工资单,看完扎心了...
  4. Winform如何进行左边菜单栏,右边内容的设计
  5. ODBC、OLEDB和ADO之间的关系
  6. cn域名保护隐私_域名隐私保护的含义及获取方法
  7. Linux配置ntp时间服务器(全)
  8. vue坑-vconsole.min.js?3a34:10 [Vue warn]: Duplicate keys detected: ‘0‘. This may cause an update erro
  9. UML 是什么,包括什么,九种图
  10. 2020中国高校计算机大赛网络技术挑战赛,我校学子在2020年(第五届) 中国高校计算机大赛网络技术挑战赛斩获国家一等奖等奖项...