http://acm.timus.ru/problem.aspx?space=1&num=1286
题意
你现在在 (x0,y0) ,每次可以从 (i,j) 移动到 (i±p,j±q) , (i±q,j±p) ,问是否能移动到 (x1,y1)
题解
即 a×p+b×q=x1−x0,c×p+d×q=y1−y0 其中a,d、b,c同奇偶
计算 dx,dy,d=gcd(p,q) ,如果 ¬(d|dx)∨¬(d|dy) 无解,否则一定存在整数解。那么, dx,dy,p,q 全部除以 d ,此时:
若
若
dx,dy
奇偶性相同,此时通过调整
a,b
奇偶性能满足题意
若
p,q
奇偶性相同,
dx,dy
奇偶性不同,此时
p,q
均为奇数(为偶数与
gcd
矛盾),不妨设
p=1,q=1,dx=0,dy=1
, 那么
a,b
同奇偶,
c,d
异奇偶,无解
注意判断 (dx=0∧dy=0) 与 (p=0∧q=0) 的情况,以及long long
code
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>
#define x0 x664866230
#define y0 y664866230
#define x1 x664866231
#define y1 y664866231
typedef long long LL;
LL p, q, x0, y0, x1, y1;
void solve() {
scanf("%I64d%I64d%I64d%I64d%I64d%I64d", &p, &q, &x0, &y0, &x1, &y1);
LL dx = x1-x0, dy = y1-y0;
if (dx == 0 && dy == 0) { puts("YES"); return; }
if (p == 0 && q == 0) { puts("NO"); return; }
LL d = std::__gcd(p, q);
if (dx % d != 0 || dy % d != 0) { puts("NO"); return; }
p /= d, q /= d, dx /= d, dy /= d;
if (((p^q)&1) || !((dx^dy)&1)) puts("YES"); else puts("NO");
}
int main() {
// freopen("D.in", "r", stdin);
solve();
// for(;;);
return 0;
}