Gcd如何在这段代码中运行?

时间:2017-06-25 18:13:52

标签: c++ greatest-common-divisor

我尝试在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;
}

1 个答案:

答案 0 :(得分:1)

为了解释上述问题的解决方案,我将首先显示答案是 - LCM(B,N)/B,然后告诉您这是如何等于N/GCD(B,N)

第一部分 -
现在假设在按照上述步骤后再次达到A时,他会向f朋友致意。(注意,通过上述程序欢迎的两个朋友可以是相同的)。此外,假设当他到达A时,他会做出r轮的圆圈 现在我们可以说 - f * B = r * N = C
设这等于某个常数C。显然,C是BN的倍数,它是BN的最低公倍数(LCM)(因为我们想尽快给出答案)它是第一次到达。) 所以f = LCM(B,N)/B。注意f是他打招呼的朋友数量,因此这是必要的答案。

第二部分 -
对于分别为GCD和LCM ab的两个正整数gl,我们有以下关系 - 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)