CodeForces 1200C Round Corridor
CODEFORCES-1200C- Round Corridor
题目链接:https://codeforces.com/contest/1200/problem/C
题目大意:NULL
解题思路:在内圈中,墙的位置在(1,1/n)(1,2/n)(1,3/n)(1,4/n) ...(1,n/n)在外圈中,墙的位置在(1,1/m)(1,2/m)(1,3/m)(1,4/m)...(1,m/m)
对于某些特定的值x总有一堵墙同时存在(1,x/n) (2,x/m)也就是说如果y<x,z>x我们就不能从y到z。
我们使g=gcd(n,m),上述那种特殊的墙位于1/g,2/g..g/g,这种墙把内圈和外圈分为了g组,我们只可能在相同的组内移动,并不能在不同的组内移动。对于一些 x=(1,1/g)
(1,2/g)...(1,n/g) 属于组1 x=(1,n/g+1) (1,n/g+2)...(1,2n/g) 属于组2,依此类推,对外圈同样也是,因此我们只需要判断y/(n/g)是否与z/(m/g)相等即可
#include<iostream> using namespace std; const int maxn=1e6+10; typedef long long ll; ll n,m,q,sx,sy,ex,ey; ll gcd(ll x,ll y) { if(y==0)return x; else return gcd(y,x%y); } void solve() { ll s1=n/gcd(n,m); ll s2=m/gcd(n,m); ll c1,c2; if(sx==1) c1=(sy-1)/s1; else c1=(sy-1)/s2; if(ex==1) c2=(ey-1)/s1; else c2=(ey-1)/s2; if(c1==c2) cout<<"YES"<<endl; else cout<<"NO"<<endl; } int main() { cin>>n>>m>>q; while(q--) { cin>>sx>>sy>>ex>>ey; solve(); } std::ios::sync_with_stdio(false); return 0; }