1. 程式人生 > >【[HAOI2011]向量】

【[HAOI2011]向量】

靠瞎猜的數學題

首先我們先對這些向量進行一頓組合,會發現\((a,b)(a,-b)\)可以組合成\((2a,0)\)\((b,-a)(b,a)\)可以組合成\((2b,0)\),同理\((0,2a)\)\((0,2b)\)自然也是可以組合成的

這個\(0\)很有用,可以只對一項考慮

所以如果這個時候有\(2ax+2by=X\),\(2ax+2by=Y\),就可以滿足了

根據貝祖定理如果\((2a,2b)|X\)\((2a,2b)|Y\)那麼這個時候就滿足了

之後還有一些情況

  1. 加上一個\((a,b)\),變成\(2ax+2by=X+a\)\(2ax+2by=Y+b\)

  2. 加上一個\((b,a)\)

    ,變成\(2ax+2by=X+b\)\(2ax+2by=Y+a\)

  3. \((a,b)\)\((b,a)\)都加上,變成\(2ax+2by=X+a+b\)\(2ax+2by=Y+a+b\)

還是分別套用貝祖定理就可以解決了

程式碼

#include<iostream>
#include<cstring>
#include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
#define LL long long
#define re register
LL gcd(LL a,LL b)
{
    if(!b) return a;
    return gcd(b,a%b);
}
inline LL read()
{
    char c=getchar();
    LL x=0,r=1;
    while(c<'0'||c>'9') 
    {
        if(c=='-') r=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
        x=(x<<3)+(x<<1)+c-48,c=getchar();
    return x;
}
int T;
LL a,b,x,y,now;
int main()
{
    T=read();
    while(T--)
    {
        a=read(),b=read(),x=read(),y=read();
        if(!a&&!b)
        {
            if(!x&&!y) puts("Y");
                else puts("N");
            continue;
        }
        if(!a||!b)
        {
            if(x%max(a,b)==0&&y%max(a,b)==0) puts("Y");
                else puts("N");
            continue;
        }
        now=gcd(2*a,2*b);
        if(x%now==0&&y%now==0) puts("Y");
            else if((x+a)%now==0&&(y+b)%now==0) puts("Y");
                else if((x+b)%now==0&&(y+a)%now==0) puts("Y");
                    else if((x+a+b)%now==0&&(y+a+b)%now==0) puts("Y");
                        else puts("N");
    }
    return 0;
}