[gcd,灵感] Codeforces 1200C Round Corridor
题目:https://codeforces.com/contest/1200/problem/C
1 second
256 megabytes
standard input
standard output
Amugae is in a very large round corridor. The corridor consists of two areas. The inner area is equally divided by nn sectors, and the outer area is equally divided by mm sectors. A wall exists between each pair of sectors of same area (inner or outer), but there is no wall between the inner area and the outer area. A wall always exists at the 12 o'clock position.

The inner area's sectors are denoted as (1,1),(1,2),…,(1,n)(1,1),(1,2),…,(1,n) in clockwise direction. The outer area's sectors are denoted as (2,1),(2,2),…,(2,m)(2,1),(2,2),…,(2,m) in the same manner. For a clear understanding, see the example image above.
Amugae wants to know if he can move from one sector to another sector. He has qq questions.
For each question, check if he can move between two given sectors.
The first line contains three integers nn, mm and qq (1≤n,m≤10181≤n,m≤1018, 1≤q≤1041≤q≤104) — the number of sectors in the inner area, the number of sectors in the outer area and the number of questions.
Each of the next qq lines contains four integers sxsx, sysy, exex, eyey (1≤sx,ex≤21≤sx,ex≤2; if sx=1sx=1, then 1≤sy≤n1≤sy≤n, otherwise 1≤sy≤m1≤sy≤m; constraints on eyey are similar). Amague wants to know if it is possible to move from sector (sx,sy)(sx,sy) to sector (ex,ey)(ex,ey).
For each question, print "YES" if Amugae can move from (sx,sy)(sx,sy) to (ex,ey)(ex,ey), and "NO" otherwise.
You can print each letter in any case (upper or lower).
4 6 3
1 1 2 3
2 6 1 2
2 6 2 4
YES
NO
YES
Example is shown on the picture in the statement.
题意:
有一个圆形迷宫分2层,在12点钟方向有一面墙隔住了第1层和第2层,第1层被n-1面墙平均分为n份,
第2层被m-1面墙平均分为m份,给这些区域按层数和墙分割的部分标上坐标,现在又q个询问,每次询问
给出2个坐标,问这两个坐标对应的部分是否可达
思路:
一开始就想如果要判断可达的情况就要先知道什么时候不可达,不可达就是两层的墙位置重合把路口堵住了,
那么就要知道在什么情况下墙会重合,因为12点钟方向有墙,我们可以把这个圆形迷宫拉伸成两条直线来处理,
观察题目的图发现,1层被分为了4份,2层被分为了6份,4和6的gcd是2,这样就被分为2个2份+3份,每一个2份+3份之内是可达的,
但它们之间是不可达的,因为被墙堵住了,也就是说,求出它们的gcd就知道了能被分为多少份,看2个坐标是不是在同一份中就可知道它们之间是否可达,
当然这只是个猜想,不过试了几个样例之后发现是可以的,于是写了成代码后竟然过了,有时候还是要大胆猜想,灵感很重要
在实现时有一个问题,就是比如题目图片中的样例,(1,1),(1,2),(2,1),(2,2),(2,3)是互相可达的,如果第1层则y/=(n/gcd(n,m)),如果第2层则y/=(m/gcd(n,m))
如果最后两个y相等,则说明他们在同一个可达区域内,但有一个问题,1/2=0,2/2=1,1/3=0,2/3=0,3/3=1,可以发现y%(n/gcd(n,m))==0或y%(m/gcd(n,m))==0的地方除了(n/gcd(n,m))或(m/gcd(n,m))之后多了1,
但他们应该和前面的分为一类,所以当y%(n/gcd(n,m))==0或y%(m/gcd(n,m))==0时我们把他们的y减1,这样就可以和他们前面的分为一类了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
int main(){
ll n,m,q,sx,sy,ex,ey;
cin>>n>>m>>q;
ll g=gcd(n,m),na=n/g,ma=m/g; ///算gcd和各自要除的数
while(q--){
cin>>sx>>sy>>ex>>ey;
if(g==){printf("YES\n");continue;} ///如果他们互质则任意坐标都相互可达,因为只有一个连通类
if(sx==){if(sy%na==)sy--;sy/=na;} ///如果是第一层,如果y是na的倍数,则y要-1,再把y/=na
else{if(sy%ma==)sy--;sy/=ma;} ///否则是第二层,如果y是ma的倍数,则y要-1,再把y/=ma
if(ex==){if(ey%na==)ey--;ey/=na;} ///与上同理
else{if(ey%ma==)ey--;ey/=ma;}
if(sy==ey)printf("YES\n"); ///如果处理过后的y相等,则说明这两个坐标在同一个连通类内,输出YES
else printf("NO\n"); ///否则输出NO
}
}
/**
有一个圆形迷宫分2层,在12点钟方向有一面墙隔住了第1层和第2层,第1层被n-1面墙平均分为n份,
第2层被m-1面墙平均分为m份,给这些区域按层数和墙分割的部分标上坐标,现在又q个询问,每次询问
给出2个坐标,问这两个坐标对应的部分是否可达
一开始就想如果要判断可达的情况就要先知道什么时候不可达,不可达就是两层的墙位置重合把路口堵住了,
那么就要知道在什么情况下墙会重合,因为12点钟方向有墙,我们可以把这个圆形迷宫拉伸成两条直线来处理,
观察题目的图发现,1层被分为了4份,2层被分为了6份,4和6的gcd是2,这样就被分为2个2份+3份,每一个2份+3份之内是可达的,
但它们之间是不可达的,因为被墙堵住了,也就是说,求出它们的gcd就知道了能被分为多少份,看2个坐标是不是在同一份中就可知道它们之间是否可达,
当然这只是个猜想,不过试了几个样例之后发现是可以的,于是写了成代码后竟然过了,有时候还是要大胆猜想,灵感很重要
在实现时有一个问题,就是比如题目图片中的样例,(1,1),(1,2),(2,1),(2,2),(2,3)是互相可达的,如果第1层则y/=(n/gcd(n,m)),如果第2层则y/=(m/gcd(n,m))
如果最后两个y相等,则说明他们在同一个可达区域内,但有一个问题,1/2=0,2/2=1,1/3=0,2/3=0,3/3=1,可以发现y%(n/gcd(n,m))==0或y%(m/gcd(n,m))==0的地方除了(n/gcd(n,m))或(m/gcd(n,m))之后多了1,
但他们应该和前面的分为一类,所以当y%(n/gcd(n,m))==0或y%(m/gcd(n,m))==0时我们把他们的y减1,这样就可以和他们前面的分为一类了
**/
[gcd,灵感] Codeforces 1200C Round Corridor的更多相关文章
- 【CodeForces - 1200C】Round Corridor (数论gcd)
Round Corridor Descriptions Amugae位于一个非常大的圆形走廊中.走廊由两个区域组成.内部区域等于nñ扇区,外部区域等于m米部门.在相同区域(内部或外部)的每对扇区之间 ...
- CodeForces Global Round 1
CodeForces Global Round 1 CF新的比赛呢(虽然没啥区别)!这种报名的人多的比赛涨分是真的快.... 所以就写下题解吧. A. Parity 太简单了,随便模拟一下就完了. B ...
- Codeforces Beta Round #73 (Div. 2 Only)
Codeforces Beta Round #73 (Div. 2 Only) http://codeforces.com/contest/88 A 模拟 #include<bits/stdc+ ...
- Codeforces Beta Round #67 (Div. 2)
Codeforces Beta Round #67 (Div. 2) http://codeforces.com/contest/75 A #include<bits/stdc++.h> ...
- Codeforces Beta Round #16 (Div. 2 Only)
Codeforces Beta Round #16 (Div. 2 Only) http://codeforces.com/contest/16 A 水题 #include<bits/stdc+ ...
- Codeforces Beta Round #9 (Div. 2 Only)
Codeforces Beta Round #9 (Div. 2 Only) http://codeforces.com/contest/9 A gcd水题 #include<bits/stdc ...
- Codeforces Global Round 1 (A-E题解)
Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^( ...
- Codeforces Global Round 3
Codeforces Global Round 3 A. Another One Bites The Dust 有若干个a,有若干个b,有若干个ab.你现在要把这些串拼成一个串,使得任意两个相邻的位置 ...
- Codeforces Global Round 1 (CF1110) (未完结,只有 A-F)
Codeforces Global Round 1 (CF1110) 继续补题.因为看见同学打了这场,而且涨分还不错,所以觉得这套题目可能会比较有意思. 因为下午要开学了,所以恐怕暂时不能把这套题目补 ...
随机推荐
- XX系统测试总结报告
XX系统测试总结报告 1 引言 1.1 编写目的 编写该测试总结报告主要有以下几个目的 1. 通过对测试结果的分析,得到对软件质量的评价 2. 分析测试的过程,产品,资源,信息, ...
- linux 的uuid码
在提到这个之前,有个概念,就是什么是uuid呢? UUID码全称是通用唯一识别码 (Universally Unique Identifier, UUID),它 是一个软件建构的标准,亦为自由软件基金 ...
- Centos7.X 搭建Prometheus+node_exporter+Grafana实时监控平台
Prometheus简介 什么是 Prometheus Prometheus是一个开源监控报警系统和时序列数据库 主要功能 多维数据模型(时序由 metric 名字和 k/v 的 labels 构成) ...
- maven包引入问题ClassNotFoundException: org.elasticsearch.client.Cancellable
业务需要,做搜索功能,在springboot聚合项目下,新建了es模块module 但是在引入elasticsearch依赖的时候,出现了问题 引入相应依赖后 <dependency> & ...
- 编写简单i18n库
i18n是什么?i18n(其来源是英文单词internationalization的首末字符i和n,18为中间的字符数)是"国际化"的简称. 前言 第一次接触多语言是用野生java ...
- 微信h5页面调用第三方位置导航
微信h5页面拉起第三方导航应用 需要准备的: 通过微信认证的公众号有备案过的域名 背景:微信公众号点击菜单栏跳到h5页面,需要用到导航功能 需求:当用户点击导航按钮时,跳转到第三方app进行导航 参考 ...
- css的相对定位与绝对定位
css相对定位:是相对于它本身最近的父级定位 css绝对定位:是对于它本身最接近的参照物来定位,如果没有就对于body来定位
- 大厂常问iOS面试题--性能优化篇
1.造成tableView卡顿的原因有哪些? 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候 ...
- flask 模型之间的关系 操作注意点
在创建模型时使用 # 关联表与表 添加以下参数 lazy='dynamic' 在两个表之间使用关联字段可以再次进行操作,筛选,分页 具体操作请看 https://www.bilibili.com/ ...
- 数据库中的两个最重要的日志redo log和binlog
mysql整体来看其实只有两部分,一部分是server层,一部分是引擎层. 1.redo log(重做日志):当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写入redo log里面,并更新 ...