BZOJ2299 裴蜀定理

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;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值