1286. Starship Travel
Time limit: 1.0 second
Memory limit: 64 MB
Memory limit: 64 MB
It is well known that a starship equipped with class B hyperengine is able to travel from any planet to any other planet. But your starship got severe damage in the last travel and now its movement
ability is limited. The starship’s technician determined that with the damaged hyperengine the vehicle can move from a point with coordinates (i,j) only to a point from the following list: (i+q, j+p), (i−q, j+p),
(i+q, j−p), (i−q, j−p), (i+p, j+q), (i−p, j+q), (i+p, j−q), (i−p, j−q)
(all the coordinates here are integers and are given in the standard intergalaxy system). Help the captain of your ship to find out if the ship is able to reach the destination planet on its own or a repair ship must be called.
Input
The first line contains two integers p and q (the two remaining discrete power rates of the damaged hyperengine) separated with a space. The second line contains the coordinates of
the point where the spaceship is now. The third line contains the coordinates of the destination planet. The numbers in the second and third lines are also separated with spaces. All the numbers are integers and do not exceed 2·109 in
absolute value.
Output
If the commander can move the damaged starship to the destination planet, write ‘YES’. Write ‘NO’ if a repair ship must be called.
Samples
input | output |
---|---|
4 6 0 0 10 10 |
YES |
4 6 0 0 9 9 |
NO |
Problem Author: Alexander Klepinin
Problem Source: USU Personal Contest 2004
Problem Source: USU Personal Contest 2004
一个任意大的棋盘,一个Knight每次的移动可以从(i,j)到(i+q, j+p), (i−q, j+p),(i+q, j−p), (i−q, j−p),
(i+p, j+q), (i−p, j+q),(i+p, j−q), (i−p, j−q) 中的任意一个。给定初始坐标(sX,sY) 问Knight是否可以移动到(dX,dY)?(所有的整数的绝对值均<=2·10^9 )。
(i+p, j+q), (i−p, j+q),(i+p, j−q), (i−p, j−q) 中的任意一个。给定初始坐标(sX,sY) 问Knight是否可以移动到(dX,dY)?(所有的整数的绝对值均<=2·10^9 )。
数形结合
#include <iostream>
#include <cstdio>
using namespace std;
long long gcd(long long a,long long b)
{
return b?gcd(b,a%b):a;
}
int main()
{
long long p,q,x,y,x1,x2,y1,y2;
while(cin>>p>>q>>x1>>y1>>x2>>y2)
{
x=x2-x1;
y=y2-y1;
if(x==0&&y==0)
puts("YES");
else if(p==0&&q==0)
puts("NO");
else
{
long long n=p*x-q*y;
long long g=gcd(2*p*q,gcd(p*p-q*q,p*p+q*q));
if(n%g==0)
puts("YES");
else
puts("NO");
}
}
return 0;
}