1. 程式人生 > 其它 >#裴蜀定理#洛谷 2520 [HAOI2011]向量

#裴蜀定理#洛谷 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;
}