#裴蜀定理#洛谷 2520 [HAOI2011]向量
阿新 • • 發佈:2021-12-21
裴蜀定理
分析
首先若 \(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; }