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;
}
原文地址:https://www.cnblogs.com/tombraider-shadow/p/11338120.html