luogu P2520 [HAOI2011]向量

传送门

一堆人说数论只会gcd,我连gcd都不会,菜死算了qwq

Orzyyb

这题欺负我数学不好qwq

首先可以发现实际上有如下操作:x或y±2a,x或y±2b,x+a y+b,x+b y+a(后面两个也可以看做减)

然后可以考虑先只用(2a)(2b)去凑(x,y),但是因为后两个操作,也可以去凑(x+a,y+b),(x+b,y+a),(x+a+b,y+a+b),然后化为(x,y)

有个叫裴蜀定理的东西,(ax+by=c)当且仅当(c|gcd(a,b))

所以如果上面四个二元组中有一个满足两个元素都是(2gcd(a,b))的倍数就有解了

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register

using namespace std;
il LL rd()
{
    LL x=0,w=1;char ch=0;
    while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*w;
}
il int gcd(int a,int b){return b?gcd(b,a%b):a;}

int main()
{
    int T=rd();
    while(T--)
    {
        LL a=rd(),b=rd(),x=rd(),y=rd(),d=gcd(a,b)<<1;
        if(x%d==0&&y%d==0) puts("Y");
        else if((x+a)%d==0&&(y+b)%d==0) puts("Y");
        else if((x+b)%d==0&&(y+a)%d==0) puts("Y");
        else if((x+a+b)%d==0&&(y+a+b)%d==0) puts("Y");
        else puts("N");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/smyjr/p/10370078.html