[HAOI2011]向量

题目链接https://www.luogu.org/problemnew/show/P2520

给你一对数a,b去拼出向量x,y

本质上是进行四种操作:+2a,-2a.+2b.-2b

例如+2a可以先加(a,b)再加(-a,b)

令A=2a B=2b d=gcd(A,B)

对于一对(x,y)若其能被构造

那么一定存在iA+jB=x,uA+vB=y

根据裴蜀定理若a,b是整数,且(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立

必须要d|x且d|y 这样(x,y)才能被构造 然后对于一对(x,y)又有四种情况(x,y) (x+a,y+b) (x+b,y+a) (x+a+b,y+a+b)

只要一种情况满足(x,y)便可以被构造

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll t,a,b,x,y;
ll d;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-f;ch=getchar();}
    while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
inline ll gcd(ll a,ll b)
{
    return b?gcd(b,a%b):a;
}
inline bool check(ll x,ll y)
{
    return x%d==0&&y%d==0;
}
int main()
{
    t=read();
    while(t--){
        a=read(),b=read(),x=read(),y=read();
        d=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("Y\n");
        else printf("N\n");         
    }
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值