题解:
最终结果与正负性无关,直接取绝对值即可。
不妨假设当前向量为
(x0,y0)
(
x
0
,
y
0
)
。
通过等价,发现只有以下操作:
1、
x0+2a
x
0
+
2
a
或
y0+2a
y
0
+
2
a
2、
x0+2b
x
0
+
2
b
或
y0+2b
y
0
+
2
b
3、
x0+a
x
0
+
a
,
y0+b
y
0
+
b
4、
x0+b
x
0
+
b
,
y0+a
y
0
+
a
且3、4至多用一次,直接枚举后利用裴蜀定理即可。
那么什么是裴蜀定理呢?
介绍:
对于任意自然数
a,b
a
,
b
,若
gcd(a,b)=d
g
c
d
(
a
,
b
)
=
d
,那么对于所有的整数
x,y
x
,
y
,都有
d|ax+by
d
|
a
x
+
b
y
,且一定存在
x,y
x
,
y
使得
ax+by=d
a
x
+
b
y
=
d
成立。
特别地,方程
ax+by=1
a
x
+
b
y
=
1
有解当且仅当
a
a
与互质。
推广:
设
gcd(a1,a2,...,an)=d
g
c
d
(
a
1
,
a
2
,
.
.
.
,
a
n
)
=
d
,那么存在整数
x1,x2,...,xn
x
1
,
x
2
,
.
.
.
,
x
n
使得
a1x1+a2x2+...+anxn=d
a
1
x
1
+
a
2
x
2
+
.
.
.
+
a
n
x
n
=
d
。
Code:
C
o
d
e
:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll d;
bool f(ll x,ll y)
{
if(x%d==0&&y%d==0)return true;
return false;
}
int main()
{
int Q;
scanf("%d",&Q);
while(Q--)
{
ll a,b,x,y;
scanf("%lld%lld%lld%lld",&a,&b,&x,&y);
d=__gcd(a,b)*2;
if(f(x,y)||f(x+a,y+b)||f(x+b,y+a)||f(x+a+b,y+b+a))puts("Y");
else puts("N");
}
return 0;
}