luogu P2520 [HAOI2011]向量

时间:2023-03-08 18:00:01

传送门

一堆人说数论只会gcd,我连gcd都不会,菜死算了qwq

Orzyyb

这题欺负我数学不好qwq

首先可以发现实际上有如下操作:x或y±2a,x或y±2b,x+a y+b,x+b y+a(后面两个也可以看做减)

然后可以考虑先只用\(2a\)或\(2b\)去凑(x,y),但是因为后两个操作,也可以去凑(x+a,y+b),(x+b,y+a),(x+a+b,y+a+b),然后化为(x,y)

有个叫裴蜀定理的东西,\(ax+by=c\)当且仅当\(c|gcd(a,b)\)

所以如果上面四个二元组中有一个满足两个元素都是\(2gcd(a,b)\)的倍数就有解了

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register using namespace std;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
il int gcd(int a,int b){return b?gcd(b,a%b):a;} int main()
{
int T=rd();
while(T--)
{
LL a=rd(),b=rd(),x=rd(),y=rd(),d=gcd(a,b)<<1;
if(x%d==0&&y%d==0) puts("Y");
else if((x+a)%d==0&&(y+b)%d==0) puts("Y");
else if((x+b)%d==0&&(y+a)%d==0) puts("Y");
else if((x+a+b)%d==0&&(y+a+b)%d==0) puts("Y");
else puts("N");
}
return 0;
}