[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 ightarrow d|ax+by forall x,y)

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

#include <bits/stdc++.h>
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");
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/12301058.html