HAOI2011 向量
题目链接:戳我
其实我们观察一下这八个衍生的向量,可以知道本质上它们只有4个。
即\((a,b),(-a,b),(b,a),(b,-a)\)。
之后就是
\[\begin{cases} an+am+bp+bq=x\\ bn-bm+ap-aq=y \end{cases}
\]
合并同类项——
\[\begin{cases}(n+m)a+(p+q)b=x\\(p-q)a+(n-m)b=y\end{cases}
\]
之后裴蜀定理,存在整数解的充要条件是\(gcd(a,b)|x\)&&\(gcd(a,b)|y\)。
但是注意这个只是\((n+m),(n-m),(p+q),(p-q)\)有整数解的判断!具体的我们还需要它们对应的,同奇偶!
所以分类讨论——
- 都是偶数
\[\begin{cases}\frac{n+m}{2}a+\frac{p+q}{2}b=\frac{x}{2}\\\frac{p-q}{2}a+\frac{n-m}b=\frac{y}{2}\end{cases}
\]
\(gcd(2*a,2*b)|x\) and \(gcd(2*a,2*b)|y\)
- 一奇一偶(这里以n+m和n-m为奇数为例)
\[\begin{cases}\frac{n+m+1}{2}a+\frac{p+q}{2}b=\frac{x+a}{2}\\\frac{p-q}{2}a+\frac{n-m+1}b=\frac{y+b}{2}\end{cases}
\]
\(gcd(2*a,2*b)|(x+a)\) and \(gcd(2*a,2*b)|(y+b)\)
or
\(gcd(2*a,2*b)|(x+y)\) and \(gcd(2*a,2*b)|(y+a)\)
- 两奇
\[\begin{cases}\frac{n+m+1}{2}a+\frac{p+q+1}{2}b=\frac{x+a+b}{2}\\\frac{p-q+1}{2}a+\frac{n-m+1}b=\frac{y+a+b}{2}\end{cases}
\]
\(gcd(2*a+2*b)|(x+a+b)\) and \(gcd(2*a+2*b)|(y+a+b)\)
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
long long a,b,x,y;
inline long long gcd(long long x,long long y){return y==0?x:gcd(y,x%y);}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld%lld",&a,&b,&x,&y);
long long cur2=gcd(2*a,2*b);
if(x%cur2==0&&y%cur2==0) printf("Y\n");
else if((x+a)%cur2==0&&(y+b)%cur2==0) printf("Y\n");
else if((x+b)%cur2==0&&(y+a)%cur2==0) printf("Y\n");
else if((x+a+b)%cur2==0&&(y+a+b)%cur2==0) printf("Y\n");
else printf("N\n");
}
return 0;
}