码迷,mamicode.com
首页 > 其他好文 > 详细

【[HAOI2011]向量】

时间:2019-01-01 21:13:03      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:getc   stream   read   lin   main   while   ret   puts   ring   

靠瞎猜的数学题

首先我们先对这些向量进行一顿组合,会发现\((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;
}

【[HAOI2011]向量】

标签:getc   stream   read   lin   main   while   ret   puts   ring   

原文地址:https://www.cnblogs.com/asuldb/p/10205707.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!