Math 可能路径[HackerRank]

Math 可能路径[HackerRank],math,Math,请参阅最近在HackerRank上发布的以下问题 亚当站在无限二维网格中的点(a,b)。他想知道他是否能到达点(x,y)。他能做的唯一操作是从某个点(a,b)移动到点(a+b,b),(a,a+b),(a-b,b)或(a,a-b)。假设他可以移动到二维网格上的任何点,即具有正或负X(或Y)坐标的点。告诉Adam他是否可以到达(X,Y) 我意识到x和y必须是a和b的某个倍数的和 所以x%(a+b)或x%(a-b)应该可以被a或b整除 同样地,对于y 但是下面的方法不起作用 long lon

请参阅最近在HackerRank上发布的以下问题


亚当站在无限二维网格中的点(a,b)。他想知道他是否能到达点(x,y)。他能做的唯一操作是从某个点(a,b)移动到点(a+b,b),(a,a+b),(a-b,b)或(a,a-b)。假设他可以移动到二维网格上的任何点,即具有正或负X(或Y)坐标的点。告诉Adam他是否可以到达(X,Y)

我意识到x和y必须是a和b的某个倍数的和

所以x%(a+b)或x%(a-b)应该可以被a或b整除 同样地,对于y

但是下面的方法不起作用

    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;      
long-long int-xb,yb,xa,ya;
xb=x%b;
xa=x%a;
yb=y%b;
ya=y%a;
//为了x
bool cxbaplusb=a+b==0?xb==0:(xb%(a+b))==0;
bool cxbaminb=a-b==0?xb==0:(xb%(a-b))==0;
//对于y
bool-cybaplusb=a+b==0?yb==0:(yb%(a+b))==0;
bool cybaminb=a-b==0?yb==0:(yb%(a-b))==0;
//为了x
bool cxaaplusb=a+b==0?xa==0:(xa%(a+b))==0;
bool cxaaminb=a-b==0?xa==0:(xa%(a-b))==0;
//对于y
bool cyaaplusb=a+b==0?ya==0:(ya%(a+b))==0;
bool cyaaminb=a-b==0?ya==0:(ya%(a-b))==0;
如果((cxbaplusb | | cxbaminb | cxaaplusb | | cxaaminb)和&(cybaplusb | | cybaminb | cyaplusb | cyaminb))

下面的数学解释可能会帮助你实现你的目标


来源:

请检查输入大小

一,≤ a、 b,x,y≤ 10^18

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"
#包括
使用名称空间std;
内部gcd(内部a、内部b){
返回b?gcd(b,a%b):a;
}
int main(){
int t;
cin>>t;
而(t--){
int a,b,x,y;
cin>>a>>b>>x>>y;
如果(gcd(abs(a),abs(b))==gcd(abs(x),abs(y)))

起初我和你有同样的疑问,但它不是“x和y必须是a和b的某个倍数的和”,因为我们可以从(a,b)移动到(a+b,b),(a-b,b),(a,b+a),(a,b-a)中的任何一点,如果你现在移动(a+b,b)a=a+b,b=b,那么对于a,b的这个值,b(不是这里给定的a更新为a+b)只有你能做上面的操作,所以x和y不一定总是a,b的某个倍数的和。所以你必须使用gcd方法

“他可以移动到这个2D网格上的任何点”/“他是否可以到达”。在“移动到一个点”和“到达一个点”之间有什么区别问题是他可以移动到任何一个点,并问他是否能达到一个给定的点?我想这意味着,如果他在某个步骤之后到达X,Y,如果他最初从A开始,B,对于这个问题,我们可以考虑“移动到点”和“达到一个点”一样。这可能是一个很好的答案,但图像是不可搜索的。它们对残疾人也不友好。如果你自己写的,你应该能够提供文本版本。如果你不是自己写的,你应该将其归因于原始来源,否则这是剽窃(声称某些东西是你自己的,而不是你的).现在,我已经分享了来源。我想现在可以了吗@CodyGray@CodyGray谢谢你在这里提醒我。我保证以后不会再重复这些事情。@vin请在解决方案上打勾。如果你满意的话。谢谢一点上下文就好了。什么是gcd()?这并没有提供任何有用的信息。gcd是最大的公约数。您好,欢迎使用stackoverflow。请详细描述答案。清晰的答案将帮助人们理解您的意思,并增加选择答案的机会
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"
#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;
}