[HAOI2011] 向量 - 裴蜀定理

给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y)。

Solution

等价于以下操作集合

  • \(x \pm 2a\)

  • \(y \pm 2a\)

  • \(x \pm 2b\)

  • \(y \pm 2b\)

  • \(x +a, y+b\)

  • \(x+b,y+a\)

\(A=2a,B=2b,d=(A,B)\)

则方程
\(iA+jB=x\)

\(iA+jB=y\) 一定都有解

根据裴蜀定理
\((a,b)=d \rightarrow d|ax+by \ \forall x,y\)

不妨先将坐标对 \(d\) 取模,那么 \(i,j\) 取值只能为 \(0,1\),都检验一遍即可

#include 
using namespace std;

int a,b,x,y;

int main() {
    int t;
    cin>>t;
    while(t--) {
        cin>>a>>b>>x>>y;
        int d=__gcd(a,b)*2;
        a%=d;b%=d;x%=d;y%=d;
        if((x%d==0 && y%d==0) ||
           ((x+a)%d==0 && (y+b)%d==0) ||
           ((x+b)%d==0 && (y+a)%d==0) ||
           ((x+a+b)%d==0 && (y+b+a)%d==0))
            puts("Y");
        else puts("N");
    }
}

你可能感兴趣的:([HAOI2011] 向量 - 裴蜀定理)