牛客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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值