给你一对数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
ightarrow d|ax+by forall x,y)
不妨先将坐标对 (d) 取模,那么 (i,j) 取值只能为 (0,1),都检验一遍即可
#include <bits/stdc++.h>
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");
}
}