Codeforces 1200C 【水题】

C. Round Corridor

Amugae is in a very large round corridor. The corridor consists of two areas. The inner area is equally divided by n sectors, and the outer area is equally divided by m 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.
Codeforces 1200C 【水题】_第1张图片
The inner area’s sectors are denoted as (1,1),(1,2),…,(1,n) in clockwise direction. The outer area’s sectors are denoted as (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 q questions.

For each question, check if he can move between two given sectors.

Input

The first line contains three integers n, m and q (1≤n,m≤1018, 1≤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 q lines contains four integers sx, sy, ex, ey (1≤sx,ex≤2; if sx=1, then 1≤sy≤n, otherwise 1≤sy≤m; constraints on ey are similar). Amague wants to know if it is possible to move from sector (sx,sy) to sector (ex,ey).

Output

For each question, print “YES” if Amugae can move from (sx,sy) to (ex,ey), and “NO” otherwise.

You can print each letter in any case (upper or lower).

Example

input
4 6 3
1 1 2 3
2 6 1 2
2 6 2 4

outputCopy
YES
NO
YES

Note

Example is shown on the picture in the statement.

思路

有一个非常大的圆形走廊中。走廊由两个区域组成。内部区域被n个扇区等分,外部区域被m个扇区等分。在相同区域(内部或外部)的每对扇区之间存在壁,但在内部区域和外部区域之间没有壁。只要有墙壁,则至少有一堵墙壁存在于12点钟位置。一开始没有理解题意,以为是单纯的两个区域对半分,看完数据之后才知道,原来是内外两个区域都被n和m平分的。这样可能会出现不止两个封闭区域的情况,那么就需要求gcd,作用在于求出一共有多少个封闭区域。然后再用sy和ey除以gcd求出对应的区域所在的序号数,如果区域序号相同则相同。

代码

#include
#include
using namespace std;
typedef long long ll;

ll n,m,q,g,ng,mg;

bool solve(ll sx, ll sy, ll ex, ll ey) {
	ll block1,block2;
	sy--;
	ey--;
	if(sx == 1) {
		block1 = sy / ng;
	}
	else {
		block1 = sy / mg;
	}
	if(ex == 1) {
		block2 = ey / ng;
	}
	else {
		block2 = ey / mg;
	}
	if(block1 == block2) {
		return true;
	}
	else {
		return false;
	}
}

int main() {
	cin >> n >> m >> q;
	g = __gcd(n,m);
	ng = n / g;
	mg = m / g;
	while(q--) {
		ll sx,sy,ex,ey;
		cin >> sx >> sy >> ex >> ey;
		if(solve(sx,sy,ex,ey)) {
			puts("YES");
		}
		else {
			puts("NO");
		}
	}
}

题目来源

Codeforces 1200C

你可能感兴趣的:(水题,Codeforces,思维题)