codeforces C - Round Corridor(思维题)
题目
http://codeforces.com/contest/1200/problem/C
题意
给你n,m,q。n代表内圈平均分成n份,m代表外圈平均分成m份,每份之间有个墙堵着,内外圈之间没有墙。
接下来q次询问,问你(x0,y1)和(x1,y1)之间是否连通。
题解
通过观察我们可以发现:n走廊每 n/gcd 块区域 和 m走廊每 m/gcd块区域一定可以互通, 其他的一定会隔绝,判断两个位置属不属于同一块区域就可以了,这里注意y0和y1要减小一个单位。
代码
#include<stdio.h>
#define ll long long
ll gcd(ll a,ll b)
{
while(b^=a^=b^=a%=b);
return a;
}
int main()
{
ll n,m;
int q;
scanf("%lld %lld %d",&n,&m,&q);
ll nn = n/gcd(n,m);
ll mm = m/gcd(n,m);
while(q--)
{
ll x0,y0,x1,y1;
ll a,b;
scanf("%lld %lld %lld %lld",&x0,&y0,&x1,&y1);
y0--,y1--;
if(x0 == 1)
a = y0/nn;
else
a = y0/mm;
if(x1 == 1)
b = y1/nn;
else
b = y1/mm;
if(a == b)
puts("YES");
else
puts("NO");
}
return 0;
}