http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1247&judgeId=598078
题目来源: HackerRank
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
收藏
关注
在一个无限大的二维网格上,你站在(a,b)点上,下一步你可以移动到(a + b, b), (a, a + b), (a - b, b), 或者 (a, a - b)这4个点。
给出起点坐标(a,b),以及终点坐标(x,y),问你能否从起点移动到终点。如果可以,输出"Yes",否则输出"No"。
例如:(1,1) 到 (2,3),(1,1) -> (2,1) -> (2,3)。
Input
第1行:一个数T,表示输入的测试数量(1 <= T <= 5000)
第2 - T + 1行:每行4个数,a, b, x, y,中间用空格分隔(1 <= a, b, x, y <= 10^18)
Output
输出共T行,每行对应1个结果,如果可以,输出"Yes",否则输出"No"。
Input示例
2
1 1 2 3
2 1 2 3
Output示例
Yes
Yes
刚开始想肯定和余数有关,有一个起点(a,b) 终点(x,y) 现在判断是不是可以有起点到终点
比如 (a,b) ——》(b,a) (a,b)->(a+b,b)->(a+b,a)->(b,a);
证明他的每一个路径倒能倒回去, 如果(a-b,b)->(a-2*b,b)->......(a-n*b,b) n=a/b的时候,感觉像不像辗转相除法,
也就是说只要他们两个有最大的公因子就能够根据途径找到去最大公因子的路。注意范围
#include<iostream>
#include<string.h>
#include<algorithm>
#define maxn 3000
#define ll long long
int a[maxn];
int b[maxn*maxn];
using namespace std;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
int main()
{
ll t;
cin>>t;
while(t--)
{
ll x,y,dx,dy;
cin>>x>>y>>dx>>dy;
ll f1=gcd(x,y);
ll f2=gcd(dx,dy);
if(f1==f2) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}