【[HAOI2011]向量】
阿新 • • 發佈:2019-01-01
靠瞎猜的數學題
首先我們先對這些向量進行一頓組合,會發現\((a,b)(a,-b)\)可以組合成\((2a,0)\),\((b,-a)(b,a)\)可以組合成\((2b,0)\),同理\((0,2a)\)和\((0,2b)\)自然也是可以組合成的
這個\(0\)很有用,可以只對一項考慮
所以如果這個時候有\(2ax+2by=X\),\(2ax+2by=Y\),就可以滿足了
根據貝祖定理如果\((2a,2b)|X\)且\((2a,2b)|Y\)那麼這個時候就滿足了
之後還有一些情況
加上一個\((a,b)\),變成\(2ax+2by=X+a\)和\(2ax+2by=Y+b\)
加上一個\((b,a)\)
\((a,b)\)和\((b,a)\)都加上,變成\(2ax+2by=X+a+b\)和\(2ax+2by=Y+a+b\)
還是分別套用貝祖定理就可以解決了
程式碼
#include<iostream> #include<cstring> #include<cstdio> #define max(a,b) ((a)>(b)?(a):(b)) #define LL long long #define re register LL gcd(LL a,LL b) { if(!b) return a; return gcd(b,a%b); } inline LL read() { char c=getchar(); LL x=0,r=1; while(c<'0'||c>'9') { if(c=='-') r=-1; c=getchar(); } while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar(); return x; } int T; LL a,b,x,y,now; int main() { T=read(); while(T--) { a=read(),b=read(),x=read(),y=read(); if(!a&&!b) { if(!x&&!y) puts("Y"); else puts("N"); continue; } if(!a||!b) { if(x%max(a,b)==0&&y%max(a,b)==0) puts("Y"); else puts("N"); continue; } now=gcd(2*a,2*b); if(x%now==0&&y%now==0) puts("Y"); else if((x+a)%now==0&&(y+b)%now==0) puts("Y"); else if((x+b)%now==0&&(y+a)%now==0) puts("Y"); else if((x+a+b)%now==0&&(y+a+b)%now==0) puts("Y"); else puts("N"); } return 0; }