题目:
https://ac.nowcoder.com/acm/problem/19985
给你一对数
a
,
b
a,b
a,b,你可以任意使用
(
a
,
b
)
,
(
a
,
−
b
)
,
(
−
a
,
b
)
,
(
−
a
,
−
b
)
,
(
b
,
a
)
,
(
b
,
−
a
)
,
(
−
b
,
a
)
,
(
−
b
,
−
a
)
(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)
(a,b),(a,−b),(−a,b),(−a,−b),(b,a),(b,−a),(−b,a),(−b,−a)这些向量,问你能不能拼出另一个向量
(
x
,
y
)
(x,y)
(x,y)。
说明:这里的拼就是使得你选出的向量之和为 ( x , y ) (x,y) (x,y)
思路:
首先,我们注意到题目中的向量实际只有4种操作:
(
a
,
b
)
,
(
b
,
a
)
,
(
a
,
−
b
)
,
(
b
,
−
a
)
(a,b),(b,a),(a,-b),(b,-a)
(a,b),(b,a),(a,−b),(b,−a)
于是由题意得方程组:
k
(
a
,
b
)
+
q
(
b
,
a
)
+
w
(
a
,
−
b
)
+
c
(
b
,
−
a
)
=
(
x
,
y
)
⟹
{
(
k
+
w
)
a
+
(
q
+
c
)
b
=
x
(
k
−
w
)
b
+
(
q
−
c
)
a
=
y
k(a,b)+q(b,a)+w(a,-b)+c(b,-a)=(x,y)\Longrightarrow\begin{cases}(k+w)a+(q+c)b=x\\(k-w)b+(q-c)a=y\end{cases}
k(a,b)+q(b,a)+w(a,−b)+c(b,−a)=(x,y)⟹{(k+w)a+(q+c)b=x(k−w)b+(q−c)a=y
(
k
+
w
)
,
(
q
+
c
)
,
(
k
−
w
)
,
(
q
−
c
)
(k+w),(q+c),(k-w),(q-c)
(k+w),(q+c),(k−w),(q−c)均为整数的充要条件是
g
c
d
(
a
,
b
)
∣
x
且
g
c
d
(
a
,
b
)
∣
y
gcd(a,b)|x且gcd(a,b)|y
gcd(a,b)∣x且gcd(a,b)∣y
但是注意到
(
k
+
w
)
,
(
k
−
w
)
(k+w),(k-w)
(k+w),(k−w)有整数解不一定
k
k
k和
w
w
w有整数解(
(
q
+
c
)
(q+c)
(q+c)和
(
q
−
c
)
(q-c)
(q−c)是同理的)。此时不妨设
(
k
+
w
)
=
f
,
(
k
−
w
)
=
g
(k+w)=f,(k-w)=g
(k+w)=f,(k−w)=g
则
k
=
(
f
+
g
)
/
2
,
w
=
(
f
−
g
)
/
2
k=(f+g)/2,w=(f-g)/2
k=(f+g)/2,w=(f−g)/2
所以
2
∣
(
f
+
g
)
且
2
∣
(
f
−
g
)
2|(f+g)且2|(f-g)
2∣(f+g)且2∣(f−g)
显然要使
k
k
k和
w
w
w均为整数则
f
f
f和
g
g
g均为偶数或均为奇数(
(
q
+
c
)
(q+c)
(q+c)和
(
q
−
c
)
(q−c)
(q−c))同理。
考虑四种情况:
- 如果 ( k + w ) , ( k − w ) , ( q + c ) , ( q − c ) (k+w),(k-w),(q+c),(q-c) (k+w),(k−w),(q+c),(q−c)均为偶数时 ⟺ 2 g c d ( a , b ) ∣ x , 2 g c d ( a , b ) ∣ y \Longleftrightarrow 2gcd(a,b)|x,2gcd(a,b)|y ⟺2gcd(a,b)∣x,2gcd(a,b)∣y (把解中的 2 2 2给 a a a和 b b b)
- 如果 ( k + w ) , ( k − w ) (k+w),(k-w) (k+w),(k−w)为偶数, ( q + c ) , ( q − c ) (q+c),(q-c) (q+c),(q−c)为奇数时 ⟺ 2 g c d ( a , b ) ∣ x + b , 2 g c d ( a , b ) ∣ y + b \Longleftrightarrow 2gcd(a,b)|x+b,2gcd(a,b)|y+b ⟺2gcd(a,b)∣x+b,2gcd(a,b)∣y+b (方程两边加 b b b)
- 当 ( k + w ) , ( k − w ) (k+w),(k−w) (k+w),(k−w)为奇数, ( q + c ) , ( q − c ) (q+c),(q−c) (q+c),(q−c)为偶数时 ⟺ 2 g c d ( a , b ) ∣ x + a , 2 g c d ( a , b ) ∣ y + a \Longleftrightarrow 2gcd(a,b)|x+a,2gcd(a,b)|y+a ⟺2gcd(a,b)∣x+a,2gcd(a,b)∣y+a (方程两边加 a a a)
- 当 ( k + w ) , ( k − w ) , ( q + c ) , ( q − c ) (k+w),(k−w),(q+c),(q−c) (k+w),(k−w),(q+c),(q−c)均为奇数时 ⟺ 2 g c d ( a , b ) ∣ x + a + b , 2 g c d ( a , b ) ∣ y + a + b \Longleftrightarrow 2gcd(a,b)|x+a+b,2gcd(a,b)|y+a+b ⟺2gcd(a,b)∣x+a+b,2gcd(a,b)∣y+a+b (方程两边加 a + b a+b a+b)
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
using namespace std;
ll t,a,b,x,y,k;
il int gi()
{
ll a=0;char x=getchar();bool f=0;
while((x<'0'||x>'9')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=1;
while(x>='0'&&x<='9')a=a*10+x-48,x=getchar();
return f?-a:a;
}
il ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
il bool check(ll x,ll y){return x%k==0&&y%k==0;}
int main()
{
t=gi();
while(t--){
a=gi(),b=gi(),x=gi(),y=gi();
k=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("YE5\n");
else printf("N0\n");
}
return 0;
}