P2520 [HAOI2011]向量
题目描述
给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y)。
说明:这里的拼就是使得你选出的向量之和为(x,y)
输入输出格式
输入格式:
第一行数组组数t,(t<=50000)
接下来t行每行四个整数a,b,x,y (-2*10^9<=a,b,x,y<=2*10^9)
输出格式:
t行每行为Y或者为N,分别表示可以拼出来,不能拼出来
输入输出样例
说明
样例解释:
第一组:(2,1)+(1,2)=(3,3)
第三组:(-1,0)+(-1,0)+(0,1)+(0,1)+(0,1)=(-2,3)
Solution:
首先,我们注意到题目中的向量实际只有4种操作:
于是由题意得方程组:
由裴蜀定理可得:
x和y有整数解的充要条件是
证明:令
则原式=
显然因为gcd(a,b)为整数,而要使x和y为整数,则gcd(a,b)|c。
我们回到开始的方程组
由裴蜀定理易得:(k+w),(q+c),(k-w),(q-c)均为整数的充要条件是
但是注意到(k+w),(k-w)有整数解不一定k和w有整数解((q+c)和(q-c)是同理的)。此时不妨设
则
因为
显然要使和均为整数则和均为偶数或均为奇数(和同理)。
于是我们考虑这四种情况:
1、当均为偶数时, 提公因数结合 同理
2、当为偶数,为奇数时,先左右两边同加,再提公因数结合 同理
3、当为奇数,为偶数时,先左右两边同加,再提公因数结合 同理
4、当均为奇数时,先左右两边同加,再提公因数结合同理
只要满足上述的任意一种情况,则说明本题有整数解,说明可行,否则说明无解。
代码:
- #include<bits/stdc++.h>
- #define il inline
- #define ll long long
- #define debug printf("%d %s\n",__LINE__,__FUNCTION__)
- using namespace std;
- ll t,a,b,x,y,k;
- il int gi()
- {
- ll a=0;char x=getchar();bool f=0;
- while((x<'0'||x>'9')&&x!='-')x=getchar();
- if(x=='-')x=getchar(),f=1;
- while(x>='0'&&x<='9')a=a*10+x-48,x=getchar();
- return f?-a:a;
- }
- il ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
- il bool check(ll x,ll y){return x%k==0&&y%k==0;}
- int main()
- {
- t=gi();
- while(t--){
- a=gi(),b=gi(),x=gi(),y=gi();
- k=gcd(a,b)*2;
- if(check(x,y)||check(x+a,y+b)||check(x+b,y+a)||check(x+a+b,y+a+b))printf("YE5\n");
- else printf("N0\n");
- }
- return 0;
- }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】