[HAOI2011]向量

题目:
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(kw)b+(qc)a=y
( k + w ) , ( q + c ) , ( k − w ) , ( q − c ) (k+w),(q+c),(k-w),(q-c) (k+w),(q+c),(kw),(qc)均为整数的充要条件是 g c d ( a , b ) ∣ x 且 g c d ( a , b ) ∣ y gcd(a,b)|x且gcd(a,b)|y gcd(a,b)xgcd(a,b)y
但是注意到 ( k + w ) , ( k − w ) (k+w),(k-w) (k+w),(kw)有整数解不一定 k k k w w w有整数解( ( q + c ) (q+c) (q+c) ( q − c ) (q-c) (qc)是同理的)。此时不妨设
( k + w ) = f , ( k − w ) = g (k+w)=f,(k-w)=g (k+w)=f,(kw)=g

k = ( f + g ) / 2 , w = ( f − g ) / 2 k=(f+g)/2,w=(f-g)/2 k=(f+g)/2,w=(fg)/2
所以
2 ∣ ( f + g ) 且 2 ∣ ( f − g ) 2|(f+g)且2|(f-g) 2(f+g)2(fg)
显然要使 k k k w w w均为整数则 f f f g g g均为偶数或均为奇数( ( q + c ) (q+c) (q+c) ( q − c ) (q−c) (qc))同理。

考虑四种情况:

  1. 如果 ( k + w ) , ( k − w ) , ( q + c ) , ( q − c ) (k+w),(k-w),(q+c),(q-c) (k+w),(kw),(q+c),(qc)均为偶数时 ⟺ 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)
  2. 如果 ( k + w ) , ( k − w ) (k+w),(k-w) (k+w),(kw)为偶数, ( q + c ) , ( q − c ) (q+c),(q-c) (q+c),(qc)为奇数时 ⟺ 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)
  3. ( k + w ) , ( k − w ) (k+w),(k−w) (k+w),(kw)为奇数, ( q + c ) , ( q − c ) (q+c),(q−c) (q+c),(qc)为偶数时 ⟺ 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)
  4. ( k + w ) , ( k − w ) , ( q + c ) , ( q − c ) (k+w),(k−w),(q+c),(q−c) (k+w),(kw),(q+c),(qc)均为奇数时 ⟺ 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值