请参阅最近在HackerRank上发布的以下问题
亚当站在无限的二维网格中的点(a,b)。他想知道他是否可以达到(x,y)点。他能做的唯一操作是从某个点(a,b)移动到点(a + b,b),(a,a + b),(a-b,b)或(a,a-b)。给出他可以移动到这个2D网格上的任何点,即具有正或负X(或Y)坐标的点。告诉Adam他是否可以达到(x,y)。
https://www.hackerrank.com/contests/infinitum-jun14/challenges/possible-path
我意识到x和y必须是a和b的某个倍数的总和......
因此x%(a + b)或x%(a-b)应该可被a或b整除 并且类似地为... ...
但以下不起作用......
long long int xb,yb,xa,ya;
xb = x % b;
xa = x % a;
yb = y % b;
ya = y % a;
// for x
bool cxbaplusb = a+b==0 ? xb == 0: (xb%(a+b))==0;
bool cxbaminb = a-b==0 ? xb == 0: (xb%(a-b))==0;
// for y
bool cybaplusb = a+b==0 ? yb == 0: (yb%(a+b))==0;
bool cybaminb = a-b==0 ? yb == 0: (yb%(a-b))==0;
// for x
bool cxaaplusb = a+b==0 ? xa == 0: (xa%(a+b))==0;
bool cxaaminb = a-b==0 ? xa == 0: (xa%(a-b))==0;
// for y
bool cyaaplusb = a+b==0 ? ya == 0: (ya%(a+b))==0;
bool cyaaminb = a-b==0 ? ya == 0: (ya%(a-b))==0;
if ( (cxbaplusb || cxbaminb || cxaaplusb || cxaaminb) && (cybaplusb || cybaminb || cyaaplusb || cyaaminb) )
std::cout << "YES" << std::endl;
else
std::cout << "NO" << std::endl;
但这不起作用......我错过了任何条件吗?有什么建议 ??
答案 0 :(得分:3)
以下数学解释可帮助您实现目标。
来源:https://hr-filepicker.s3.amazonaws.com/infinitum-jun14/editorials/2372-possible-path.pdf
答案 1 :(得分:2)
请检查输入尺寸
1≤a,b,x,y≤10^ 18
https://www.hackerrank.com/challenges/possible-path
CPP不支持这么大的规模,它会抛出垃圾值导致错误答案
def gcd(a, b):
if(b == 0):
return a
return gcd(b, a%b)
t=input()
for i in range(t):
a = map(int, raw_input().split())
if(gcd(a[0],a[1]) == gcd(a[2],a[3])):
print "YES"
else:
print "NO"
答案 2 :(得分:0)
#include<iostream>
using namespace std;
int gcd(int a, int b){
return b ? gcd(b, a%b) : a;
}
int main(){
int t;
cin >> t;
while (t--){
int a, b, x, y;
cin >> a >> b >> x >> y;
if (gcd(abs(a), abs(b)) == gcd(abs(x), abs(y)))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
答案 3 :(得分:0)
最初,我和您有同样的疑问,但是它不是“ x和y必须是a和b的倍数之和”,因为我们可以从(a,b)移至(a + b,b)中的任意点),(ab,b),(a,b + a),(a,ba)如果现在移动(a + b,b)现在a = a + b,b = b,那么对于这个a值, b(不是这里给定的a被更新为a + b),只有您可以执行上述操作,因此x和y不必始终是a,b的倍数之和。这样就必须使用gcd方法
答案 4 :(得分:-2)
public class Solution {
public static void main(String[] args) {
int a,b,x,y;
if(gcd(x,y)=gcd(a,b))
System.out.println("Adam can reach")
else
System.out.println("Adam cannot reach")
}
}