https://www.lydsy.com/JudgeOnline/problem.php?id=2299
一道挺有意思的题
一开始我用扩展欧几里得看有没有同余项
其实是不能这么做的
我自己简单的写了两个例子体会了一下
而且几乎是没法去实现的
后来看了题解
看到了美丽又优雅的解法
根本不用去判定a向量使用次数和b向量的使用次数一不一样
我们同时来组合两个向量同时使用
结果可以化为2*a和2*b向量的组合而且只用判定能不能组合就好
而不用判断两边的使用次数一不一样
因为只要能组合,就是肯定可以化成一样的使用次数
而且每个向量构造的时候本身就是两边使用次数一样的时候成立的
然后就是有一个被称为裴蜀定理的一个东西
这东西其实我感觉是句废话
小学生应该都可以理解这个原理
不过我当时不知道有这个东西
知道的话肯定能理解
不过话说为什么我小的时候没有自己推出来这个东西呢?
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll G;
ll gcd(ll a,ll b){
return b == 0 ? a : gcd(b,a % b);
}
bool check(ll a,ll b){
return a % G == 0 && b %G==0;
}
int main(){
int T;
cin>>T;
ll a,b,x,y;
while(T--){
cin>>a>>b>>x>>y;
a=abs(a);
b=abs(b);
x=abs(x);
y=abs(y);
G=gcd(2*a,2*b);
if(check(x,y)||check(x+a,y+b)||check(x+b,y+a)||check(x+a+b,y+a+b))
cout<<"Y"<<endl;
else
cout<<"N"<<endl;
}
}