题目:https://codeforces.com/contest/1200/problem/C

C. Round Corridor
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

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.

Input

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).

Output

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).

Example
input

Copy
4 6 3
1 1 2 3
2 6 1 2
2 6 2 4
output

Copy
YES
NO
YES
Note

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的更多相关文章

  1. 【CodeForces - 1200C】Round Corridor (数论gcd)

    Round Corridor  Descriptions Amugae位于一个非常大的圆形走廊中.走廊由两个区域组成.内部区域等于nñ扇区,外部区域等于m米部门.在相同区域(内部或外部)的每对扇区之间 ...

  2. CodeForces Global Round 1

    CodeForces Global Round 1 CF新的比赛呢(虽然没啥区别)!这种报名的人多的比赛涨分是真的快.... 所以就写下题解吧. A. Parity 太简单了,随便模拟一下就完了. B ...

  3. Codeforces Beta Round #73 (Div. 2 Only)

    Codeforces Beta Round #73 (Div. 2 Only) http://codeforces.com/contest/88 A 模拟 #include<bits/stdc+ ...

  4. Codeforces Beta Round #67 (Div. 2)

    Codeforces Beta Round #67 (Div. 2) http://codeforces.com/contest/75 A #include<bits/stdc++.h> ...

  5. Codeforces Beta Round #16 (Div. 2 Only)

    Codeforces Beta Round #16 (Div. 2 Only) http://codeforces.com/contest/16 A 水题 #include<bits/stdc+ ...

  6. Codeforces Beta Round #9 (Div. 2 Only)

    Codeforces Beta Round #9 (Div. 2 Only) http://codeforces.com/contest/9 A gcd水题 #include<bits/stdc ...

  7. Codeforces Global Round 1 (A-E题解)

    Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^( ...

  8. Codeforces Global Round 3

    Codeforces Global Round 3 A. Another One Bites The Dust 有若干个a,有若干个b,有若干个ab.你现在要把这些串拼成一个串,使得任意两个相邻的位置 ...

  9. Codeforces Global Round 1 (CF1110) (未完结,只有 A-F)

    Codeforces Global Round 1 (CF1110) 继续补题.因为看见同学打了这场,而且涨分还不错,所以觉得这套题目可能会比较有意思. 因为下午要开学了,所以恐怕暂时不能把这套题目补 ...

随机推荐

  1. ubuntu采用apt方式安装多个版本php-fpm

    适用系统:Ubuntu 16.04 LTS / Ubuntu 14.04 LTS 安装 PHP Ondřej Surý 的 PHP PPA 为 Ubuntu 16.04/14.04 提供了 PHP7. ...

  2. Swift iOS实现把PCM语音转成MP3格式

    最近折腾了swift的语音录制识别和转码,这块还是比较坑的,由于语音识别的准确度实测大概也就80%左右,所以还是需要上传录音文件啊.首先是用讯飞语音SDK实现语音录制和识别(语音听写),第一个坑是讯飞 ...

  3. Activity源码解析 - 读书笔记

    1. Activity启动 Activity是一个比较好的模板方法模式.在Android系统启动时,第一个启动的进程是zygote进程,然后由zygote启动SystemServer,再后就是启动AW ...

  4. VM安装Linux Centos7.0虚拟机

    一.准备工作 1.安装VMware 官网https://www.vmware.com/cn.html 2.准备centos7的镜像文件 官网下载链接:http://isoredirect.centos ...

  5. 【Java】Map总结和源码注释

    前言 Map为一个Java中一个重要的数据结构,主要表示<key, value>的映射关系对.本文包括了相关Map数据结构的总结和源码的阅读注释. HashMap 初始化,可以选择第二个初 ...

  6. kali linux下运行.sh文件权限不够解决办法

    我要装一个生成免杀的神奇,系统提示权限不够 2 于是我想到了sudo,可还是不行 3 于是找到了方法 chmod   a+x   文件名 4 再运行一下,成功 5 有时有的方法很简答,只要你愿意找.

  7. YA157C交叉编译环境搭建

    目录 1.开发板简介 3.主机搭建交叉编译环境 4.编译第一个ARM Linux程序--Hello World 5.在开发板上运行Hello World程序 6.ssh登录开发板 7.注意 8.she ...

  8. node.js-web服务器

    node.js--web服务器 目前最主流的三个Web服务器是Apache.Nginx.IIS. 使用 Node 创建 Web 服务器 以下是演示一个最基本的 HTTP 服务器架构(使用8081端口) ...

  9. .Net Core 为 x86 和 x64 程序集编写 AnyCPU 包装

    前言 这几天研究了一下 vJoy 这个虚拟游戏手柄驱动,感觉挺好玩的.但是使用时发现一个问题,C# SDK 中的程序集被分为 x86 和 x64 两个版本,如果直接在 AnyCPU 平台编译运行就有隐 ...

  10. 微信SEO怎么做-最新微信SEO干货

    星辉信息科技进行微信SEO已经很多年了,结合多年的微信SEO经验通过浅谈微信SEO.微信SEO的3大优势.微信SEO的6个排名技巧.企业和个人微信SEO的4大优化战略来讲,可以完美解决B端C端微信获客 ...