题目链接https://www.luogu.org/problemnew/show/P2520
给你一对数a,b去拼出向量x,y
本质上是进行四种操作:+2a,-2a.+2b.-2b
例如+2a可以先加(a,b)再加(-a,b)
令A=2a B=2b d=gcd(A,B)
对于一对(x,y)若其能被构造
那么一定存在iA+jB=x,uA+vB=y
根据裴蜀定理若a,b是整数,且(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立
必须要d|x且d|y 这样(x,y)才能被构造 然后对于一对(x,y)又有四种情况(x,y) (x+a,y+b) (x+b,y+a) (x+a+b,y+a+b)
只要一种情况满足(x,y)便可以被构造
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll t,a,b,x,y;
ll d;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-f;ch=getchar();}
while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
inline bool check(ll x,ll y)
{
return x%d==0&&y%d==0;
}
int main()
{
t=read();
while(t--){
a=read(),b=read(),x=read(),y=read();
d=gcd(a,b)*2;
if(check(x,y)||check(x+a,y+b)||check(x+b,y+a)||check(x+a+b,y+a+b)) printf("Y\n");
else printf("N\n");
}
return 0;
}