Consider a circle with **n** points on circumference of it where **n is even**. Count number of ways we can connect these points such that no two connecting lines to cross each other and every point is connected with exactly one other point. Any point can be connected with any other point.

Consider a circle with 4 points. 1 2 3 4 In above diagram, there are two non-crossing ways to connect {{1, 2}, {3, 4}} and {{1, 3}, {2, 4}}. Note that {{2, 3}, {1, 4}} is invalid as it would cause a cross

Examples:

Input : n = 2 Output : 1 Input : n = 4 Output : 2 Input : n = 6 Output : 5 Input : n = 3 Output : Invalid n must be even.

We need to draw n/2 lines to connect n points. When we draw a line, we divide the points in two sets that need to connected. Each set needs to be connected within itself. Below is recurrence relation for the same.

Letm = n/2// For each line we draw, we divide points // into two sets such that one set is going // to be connected with i lines and other // with m-i-1 lines. Count(m) = ∑ Count(i) * Count(m-i-1) where 0 <= i < m Count(0) = 1 Total number of ways with n points = Count(m) = Count(n/2)

If we take a closer look at above recurrence, it is actually recurrence of Catalan Numbers. So the task reduces to finding n/2'th Catalan number.

Below is C++ implementation based on above idea.

// C++ program to count number of ways to connect n (where n // is even) points on a circle such that no two connecting // lines cross each other and every point is connected with // one other point. #include<iostream> using namespace std; // A dynamic programming based function to find nth // Catalan number unsigned long int catalanDP(unsigned int n) { // Table to store results of subproblems unsigned long int catalan[n+1]; // Initialize first two values in table catalan[0] = catalan[1] = 1; // Fill entries in catalan[] using recursive formula for (int i=2; i<=n; i++) { catalan[i] = 0; for (int j=0; j<i; j++) catalan[i] += catalan[j] * catalan[i-j-1]; } // Return last entry return catalan[n]; } // Returns count of ways to connect n points on a circle // such that no two connecting lines cross each other and // every point is connected with one other point. unsigned long int countWays(unsigned long int n) { // Throw error if n is odd if (n & 1) { cout << "Invalid"; return 0; } // Else return n/2'th Catalan number return catalanDP(n/2); } // Driver program to test above function int main() { cout << countWays(6) << " "; return 0; }

Output :

5

Time Complexity : O(n^{2})

Auxiliary Space : O(n)

### Asked in: Amazon

This article is contributed by **Shivam Agrawal**. If you like GeeksforGeeks and would like to contribute, you can also write an article and mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above