Number of Distinct Meeting Points on a Circular Road

Consider two cars A and B, running infinitely (either clockwise or anti-clockwise) on a circular road. Given the speed of both the cars a and b. If a or b is positive, indicate they are moving in clockwise, Else they are moving in the anti-clockwise direction. The task is to find the number of distinct points they will meet each other at.

Examples:

Input : a = 1, b = -1
Output : 2

Explanation
Car A is moving clockwise while Car B is moving anti-clockwise but their
speeds are same, so they will meet at two points i.e at the starting point
and diametrically corresponding opposite point on the road.

Input : a = 1, b = 2
Output : 1

Pre-Requisites: GCD | LCM

Approach :
Let the circumference of the circular road be d.
Let the time taken by cars A and B be ta and tb respectively. Their relative speed is a – b.

A and B start from the starting point and after some time, they will meet at starting point again. This time can be calculated by the LCM of ta and tb. Within this time period, they may meet at certain points which needs to be found out. Observe that, after they meet at the starting point they keep on meeting at the same point.

Time taken to meet again at the starting point will be,

T1 = LCM(ta, tb) = LCM(d/a, d/b) = d/GCD(a, b)

Let them meet N times in the time period T1.
So, the time delay between their consecutive meets is, say T2 can be calculated as,

T2 = (T1 / N).

This time can be calculated by calculating the time taken to meet for the first time after they start.
So, the time taken by them to meet for the first time,
Therefore, T2 = (d / (a – b)).

Dividing T1 by T2, we get,
N = (T1 / T2) = ((a – b) / GCD(a, b))

Below is implementation for the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP Program to find number of distinct point of meet on a circular road
#include <bits/stdc++.h>
using namespace std;
  
// Returns the GCD of two number.
int gcd(int a, int b)
{
    int c = a % b;
    while (c != 0) {
        a = b;
        b = c;
        c = a % b;
    }
    return b;
}
  
// Returns the number of distinct meeting points.
int numberOfmeet(int a, int b)
{
    int ans;
  
    // Find the relative speed.
    if (a > b)
        ans = a - b;
    else
        ans = b - a;
  
    // convert the negative value to positive.
    if (a < 0)
        a = a * (-1);
  
    if (b < 0)
        b = b * (-1);
  
    return ans / gcd(a, b);
}
  
// Driver Code
int main()
{
    int a = 1, b = -1;
  
    cout << numberOfmeet(a, b) << endl;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java Program to find number 
// of distinct point of meet 
// on a circular road
import java.io.*;
  
class GFG 
{
      
// Returns the GCD 
// of two number.
static int gcd(int a, int b)
{
    int c = a % b;
    while (c != 0
    {
        a = b;
        b = c;
        c = a % b;
    }
    return b;
}
  
// Returns the number of
// distinct meeting points.
static int numberOfmeet(int a, 
                        int b)
{
    int ans;
  
    // Find the relative speed.
    if (a > b)
        ans = a - b;
    else
        ans = b - a;
  
    // convert the negative 
    // value to positive.
    if (a < 0)
        a = a * (-1);
  
    if (b < 0)
        b = b * (-1);
  
    return ans / gcd(a, b);
}
  
// Driver Code
public static void main (String[] args)
{
    int a = 1, b = -1;
    System.out.println(numberOfmeet(a, b));
}
}
  
// This code is contributed by @ajit

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 Program to find 
# number of distinct point 
# of meet on a circular road
import math
  
# Returns the number of
# distinct meeting points.
def numberOfmeet(a, b):
    ans = 0;
      
    # Find the relative speed.
    if (a > b):
        ans = a - b;
    else:
        ans = b - a;
          
    # convert the negative
    # value to positive.
    if (a < 0):
        a = a * (-1);
    if (b < 0):
        b = b * (-1);
    return int(ans / math.gcd(a, b));
  
# Driver Code
a = 1;
b = -1;
print(numberOfmeet(a, b));
  
# This code is contributed by mits

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Program to find number 
// of distinct point of meet 
// on a circular road
using System;
  
class GFG
{
  
// Returns the GCD 
// of two number.
static int gcd(int a, int b)
{
    int c = a % b;
    while (c != 0) 
    {
        a = b;
        b = c;
        c = a % b;
    }
    return b;
}
  
// Returns the number of
// distinct meeting points.
static int numberOfmeet(int a, 
                        int b)
{
    int ans;
  
    // Find the relative speed.
    if (a > b)
        ans = a - b;
    else
        ans = b - a;
  
    // convert the negative 
    // value to positive.
    if (a < 0)
        a = a * (-1);
  
    if (b < 0)
        b = b * (-1);
  
    return ans / gcd(a, b);
}
  
// Driver Code
static public void Main ()
{
    int a = 1, b = -1;
    Console.WriteLine(
            numberOfmeet(a, b));
}
}
  
// This code is contributed 
// by @ajit

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP Program to find number
// of distinct point of meet
// on a circular road
  
// Returns the GCD of two number.
function gcd($a, $b)
{
    $c = $a % $b;
    while ($c != 0)
    {
        $a = $b;
        $b = $c;
        $c = $a % $b;
    }
    return $b;
}
  
// Returns the number of
// distinct meeting points.
function numberOfmeet($a, $b)
{
    $ans;
  
    // Find the relative speed.
    if ($a > $b)
        $ans = $a - $b;
    else
        $ans = $b - $a;
  
    // convert the negative
    // value to positive.
    if ($a < 0)
        $a = $a * (-1);
  
    if ($b < 0)
        $b = $b * (-1);
  
    return $ans / gcd($a, $b);
}
  
// Driver Code
$a = 1;
$b = -1;
  
echo numberOfmeet($a, $b)."\n";
      
// This code is contributed by mits
?>

chevron_right



Output:

2


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : Mithun Kumar, jit_t



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.