给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y)。
Solution
等价于以下操作集合
\(x \pm 2a\)
\(y \pm 2a\)
\(x \pm 2b\)
\(y \pm 2b\)
\(x +a, y+b\)
\(x+b,y+a\)
设 \(A=2a,B=2b,d=(A,B)\)
则方程
\(iA+jB=x\)
和
\(iA+jB=y\) 一定都有解
根据裴蜀定理
\((a,b)=d \rightarrow d|ax+by \ \forall x,y\)
不妨先将坐标对 \(d\) 取模,那么 \(i,j\) 取值只能为 \(0,1\),都检验一遍即可
#include
using namespace std;
int a,b,x,y;
int main() {
int t;
cin>>t;
while(t--) {
cin>>a>>b>>x>>y;
int d=__gcd(a,b)*2;
a%=d;b%=d;x%=d;y%=d;
if((x%d==0 && y%d==0) ||
((x+a)%d==0 && (y+b)%d==0) ||
((x+b)%d==0 && (y+a)%d==0) ||
((x+a+b)%d==0 && (y+b+a)%d==0))
puts("Y");
else puts("N");
}
}