牛客19985 HAOI2011向量(裴属定理,gcd)

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 }
View Code
原文地址:https://www.cnblogs.com/wzgg/p/11366968.html