BZOJ 2299: [HAOI2011]向量 数论

题目在这里呀!
那么开始切水题了?(划掉)

题意

题目很短了吧?

题解

表面上有八个向量,但它们合并一下就只剩下没几种情况了qwq
四种情况
1、x0+2a or y0+2b
2、x0+2b or y0+2a
3、x0+a,y0+b
4、x0+b,y0+a
然后如果3、4两种取两次又会回到1、2状态,所以下面两种暴力枚举取或不取。上面是可以用两个同余方程做滴,分别是x一个y一个/托腮。判断是否合法只要判断x’能否被gcd(2a,2b)整除,y’能否被gcd(2a,2b)整除即可。

//Suplex
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
int T;
ll a,b,x,y,d;

inline ll gcd(ll a,ll b)
{
    if(!b) return a;
    return gcd(b,a % b);
}

inline bool check(ll a,ll b)
{
    if(a % d==0 && b % d==0) return true;
    return false;
}

int main()
{
    scanf("%d",&T);
    while(T--){
        scanf("%lld%lld%lld%lld",&a,&b,&x,&y);
        d=gcd(a*2,b*2);
        if(check(x,y) || check(x-a,y-b) || check(x-b,y-a) || check(x-a-b,y-a-b)) puts("Y");
        else puts("N");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/leo_nasir/article/details/80993193