我尝试在hackerearth上解决一个问题而且我无法解决它所以我看到了编辑。他们只提供了代码而没有解释。你能否解释为什么gcd在这里使用?
问题:
史酷比和他的所有朋友聚集在一起举行派对。有N个朋友在场。 Scooby很高兴看到他的所有朋友都在一个地方,并很高兴见到他们。所有N个朋友都坐在一个圆圈中,编号从0到N-1。 Scooby最初坐在Ath朋友旁边。在和一位朋友打招呼之后,他顺时针走向Bth的下一位朋友,坐在他旁边迎接他。他重复这个直到他回到Ath朋友那里。
令他兴奋的是,Scooby有可能错过了与一些朋友的问候。你的工作是找到Scooby在回到A之前会遇到的朋友(包括A)的数量。
给出解决方案:
int main()
{
int T;
cin>>T;
while(T--)
{
long long N,A,B;
cin>>A>>B>>N;
long long g=gcd(B,N);
cout<<N/g<<endl;
}
return 0;
}
答案 0 :(得分:1)
为了解释上述问题的解决方案,我将首先显示答案是 - LCM(B,N)/B
,然后告诉您这是如何等于N/GCD(B,N)
。
第一部分 -
现在假设在按照上述步骤后再次达到A
时,他会向f
朋友致意。(注意,通过上述程序欢迎的两个朋友可以是相同的)。此外,假设当他到达A
时,他会做出r
轮的圆圈
现在我们可以说 -
f * B = r * N = C
。
设这等于某个常数C
。显然,C是B
和N
的倍数,它是B
和N
的最低公倍数(LCM)(因为我们想尽快给出答案)它是第一次到达。)
所以f = LCM(B,N)/B
。注意f是他打招呼的朋友数量,因此这是必要的答案。
第二部分 -
对于分别为GCD和LCM a
和b
的两个正整数g
和l
,我们有以下关系 - a*b = g*l
。
从上面的关系我们可以说 -
LCM(B,N)*GCD(B,N) = B*N
=> LCM(B,N)/B = N/GCD(B,N)
最后,我们得到了答案= LCM(B,N)/B
= N/GCD(B,N)
。