https://ac.nowcoder.com/acm/problem/19985
看到标签“裴属定理”就来做下,很眼熟,好像小学奥数学过。。
题意:给你a,b,x,y,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y)
思路:如(a,b)和(-a,-b)选一个就行。8个操作相当于4个...(a,b) , (b,a) , (a,-b) , (-b,a),设每个操作次数是x1,x2, x3,x4 , 则
对横坐标的贡献:(x1+x3)*a + (x2-x4)*b = x
对纵坐标的贡献:(x1-x3)*b + (x2+x4)*a = y
要让两方程有解,记gcd = gcd(a,b),则根据裴属定理需gcd|x , gcd|y,然而(x1-x3) , (x1+x3)...同奇偶,有四种情况:奇奇奇奇,偶偶偶偶,奇偶奇偶,偶奇偶奇(从左到右,从上到下),
使奇数+1后四个未知数(x1+x3)...都变为偶数,提出一个2与系数a,b结合,即gcd *= 2,然后四种情况只要有一种成立即可。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll g; 5 6 inline bool check(ll a,ll b){ 7 return (!(a%g)) && (!(b%g)); 8 } 9 10 int main(){ 11 ios::sync_with_stdio(0); 12 cin.tie(0); 13 cout.tie(0); 14 int t; 15 cin>>t; 16 while(t--){ 17 ll a,b,x,y; 18 cin>>a>>b>>x>>y; 19 g = 2*__gcd(a,b); 20 puts( ( check(x,y)||check(x+a,y+b)|| 21 check(x+b,y+a)||check(x+a+b,y+a+b) ) ? "Y" : "N"); 22 } 23 return 0; 24 }