题目链接:CF1200c
标签:数学,数论
大意:
把一个圆的内圈分为n份,外圈分为m份,并编号 如下图所示:
给出两个点,求两个点是否连通。
思路:
赛场上想的是将一个区间由360/n来表示上下限,但是这么大的数据明显精度不够。
合理的做法应该是求两个组的最大公因数进行分组,同一组内的可以互相通达。
内外环每组含元素为个数分别为:n/gcd,m/gcd
具体做法是比较(sy-1)/sg,与(ey-1)/eg(sg、eg取决于起点在内圈还是在外圈)
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=10005;
ll n,m,k;
int a[maxn];
ll gcd(ll x,ll y)
{
return y==0?x:gcd(y,x%y);
}
ll g[100];
int main()
{
cin>>n>>m;
int q;
cin>>q;
g[1]=n/gcd(n,m);
g[2]=m/gcd(n,m);
while(q--)
{
ll sx,sy,ex,ey;
cin>>sx>>sy>>ex>>ey;
ll st=(sy-1)/g[sx];
ll et=(ey-1)/g[ex];
if(st==et||gcd(n,m)==1)cout<<"YES"<<endl;//如果最大公因数为1的话肯定都能互相通达
else cout<<"NO"<<endl;
}
}