可能的路径[HackerRank]

时间:2014-06-17 10:09:06

标签: math

请参阅最近在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;      

但这不起作用......我错过了任何条件吗?有什么建议 ??

5 个答案:

答案 0 :(得分:3)

答案 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")
    }
}