#裴蜀定理#洛谷 2520 [HAOI2011]向量
分析
首先若 \(a,b\) 都为 0 要特判。
若 \(\begin{cases}x=pa+qb+p'a+q'b\\y=qa+pb-q'a-p'b\end{cases}\)
合并同类项可以得到 \(\begin{cases}x=(p+p')a+(q+q')b\\y=(q-q')a+(p-p')b\end{cases}\)
这好像是裴蜀定理,又不完全是,因为 \(p+p'\) 与 \(p-p'\) 必须同奇偶才可以。
那将最大公约数乘两倍,然后通过 \((x,y),(x+a,y+b),(x+b,y+a),(x+a+b,y+a+b)\) 判断即可
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
typedef long long lll; lll a,b,x,y,GCD;
inline lll iut(){
rr lll ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline bool check(lll x,lll y){return !(x%GCD)&&!(y%GCD);}
signed main(){
for (rr int T=iut();T;--T,putchar(10)){
a=iut(),b=iut(),x=iut(),y=iut(),GCD=__gcd(a,b)<<1;
if (!GCD) putchar((!x&&!y)?'N':'Y');
else putchar((check(x,y)||check(x+a,y+b)||check(x+b,y+a)||check(x+a+b,y+a+b))?'Y':'N');
}
return 0;
}