#裴蜀定理#洛谷 2520 [HAOI2011]向量

题目


分析

首先若 \(a,b\) 都为 0 要特判。

\(\begin{cases}x=pa+qb+p'a+q'b\\y=qa+pb-q'a-p'b\end{cases}\)

合并同类项可以得到 \(\begin{cases}x=(p+p')a+(q+q')b\\y=(q-q')a+(p-p')b\end{cases}\)

这好像是裴蜀定理,又不完全是,因为 \(p+p'\)\(p-p'\) 必须同奇偶才可以。

那将最大公约数乘两倍,然后通过 \((x,y),(x+a,y+b),(x+b,y+a),(x+a+b,y+a+b)\) 判断即可


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
typedef long long lll; lll a,b,x,y,GCD;
inline lll iut(){
	rr lll ans=0,f=1; rr char c=getchar();
	while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans*f;
}
inline bool check(lll x,lll y){return !(x%GCD)&&!(y%GCD);}
signed main(){
	for (rr int T=iut();T;--T,putchar(10)){
		a=iut(),b=iut(),x=iut(),y=iut(),GCD=__gcd(a,b)<<1;
		if (!GCD) putchar((!x&&!y)?'N':'Y');
		    else putchar((check(x,y)||check(x+a,y+b)||check(x+b,y+a)||check(x+a+b,y+a+b))?'Y':'N');
	}
	return 0;
}
posted @ 2021-12-21 18:27  lemondinosaur  阅读(27)  评论(0编辑  收藏  举报