[HAOI2011]向量

因为(a,b)与(-a,-b)完全相反,只能择其一。

所以只有这几种运算(a,b)(a,-b)(b,a)(b,-a)

(-a,-b)(-a,b)(-b,a)(b,a)[当然,题目中讲了。。。。]

把他们组合起来,就只有这四种运算

xi或yi +/-2*a;

xi或yi +/-2*b;

xi+a, yi+b

xi+b, yi+a

(xi,yi从0往上加,加到x,y

就不存在-a,-b-b,-a这两种情

况了,同时,通过观察可得,

第3、4种运算,至多运行一次,

因为运行两次,就会变成第1、

2种运算。)

//MADE BY BOBOYANG
#include <cstdio>
long long scaff()
{
 long long number=0;
 int f=1;
 char ch;
 ch=getchar();
 if(ch=='-'){f=-1;ch=getchar();}
 while(ch<'0'||ch>'9')
    ch=getchar();
 while(ch>='0'&&ch<='9')
 {
 	number=(number<<1)+(number<<3)+ch-'0';
     ch=getchar();
 }
 return number*f;
}
long long a,b,x,y;
long long d;
long long t;
long long gcd(long long a2,long long b2)
{return b2==0?a2:gcd(b2,a2%b2);}
bool iamsosad(long long  ai,long long bi,long long xi,long long yi)
{
 d=gcd(ai*2,bi*2);
 if(xi%d==0&&yi%d==0)return 1;
 if((xi+ai)%d==0&&(yi+bi)%d==0)return 1;
 if((xi+bi)%d==0&&(yi+ai)%d==0)return 1;
 if((xi+ai+bi)%d==0&&(yi+ai+bi)%d==0)return 1;
 return 0;
}
int main(void)
{
 t=scaff();
 while(t--)
 {
      a=scaff();
      b=scaff();
      x=scaff();
      y=scaff();
 	 bool flag=iamsosad(a,b,x,y);
 	 if(flag)puts("Y");
 	 else puts("N");
 }
 return 0;
} 
原文地址:https://www.cnblogs.com/zi-nai-boboyang/p/11437809.html