Math 可能路径[HackerRank]
请参阅最近在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
亚当站在无限二维网格中的点(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;
}