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

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页