Given a number n, find the number of ways to multiply n elements with an associative operation.
Examples :
Input : 2 Output : 2 For a and b there are two ways to multiply them. 1. (a * b) 2. (b * a) Input : 3 Output : 12
Explanation(Example 2) :
For a, b and c there are 12 ways to multiply them. 1. ((a * b) * c) 2. (a * (b * c)) 3. ((a * c) * b) 4. (a * (c * b)) 5. ((b * a) * c) 6. (b * (a * c)) 7. ((b * c) * a) 8. (b * (c * a)) 9. ((c * a) * b) 10. (c * (a * b)) 11. ((c * b) * a) 12. (c * (b * a))
Approach: First, we try to find out the recurrence relation. From above examples, we can see h(1) = 1, h(2) = 2, h(3) = 12 . Now, for n elements there will be n – 1 multiplications and n – 1 parentheses. And, (a1, a2, …, an ) can be obtained from (a1, a2, …, a(n – 1)) in exactly one of the two ways :
- Take a multiplication (a1, a2, …, a(n – 1))(which has n – 2 multiplications and n – 2 parentheses) and insert the nth element ‘an’ on either side of either factor in one of the n – 2 multiplications. Thus, for each scheme for n – 1 numbers gives 2 * 2 * (n – 2) = 4 * (n – 2) schemes for n numbers in this way.
- Take a multiplication scheme for (a1, a2, .., a(n-1)) and multiply on left or right by (‘an’). Thus, for each scheme for n – 1 numbers gives two schemes for n numbers in this way.
So after adding above two, we get, h(n) = (4 * n – 8 + 2) * h(n – 1), h(n) = (4 * n – 6) * h(n – 1). This recurrence relation with same initial value is satisfied by the pseudo-Catalan number. Hence, h(n) = (2 * n – 2)! / (n – 1)!
C++
// C++ code to find number of ways to multiply n // elements with an associative operation# include <bits/stdc++.h>using namespace std;// Function to find the required factorialint fact(int n){ if (n == 0 || n == 1) return 1 ; int ans = 1; for (int i = 1 ; i <= n; i++) ans = ans * i ; return ans ;}// Function to find nCrint nCr(int n, int r){ int Nr = n , Dr = 1 , ans = 1; for (int i = 1 ; i <= r ; i++ ) { ans = ( ans * Nr ) / ( Dr ) ; Nr-- ; Dr++ ; } return ans ;}// function to find the number of waysint solve ( int n ){ int N = 2*n - 2 ; int R = n - 1 ; return nCr (N, R) * fact(n - 1) ;}// Driver codeint main(){ int n = 6 ; cout << solve (n) ; return 0 ;} |
Java
// Java code to find number of // ways to multiply n elements // with an associative operationimport java.io.*;class GFG {// Function to find the// required factorialstatic int fact(int n){ if (n == 0 || n == 1) return 1 ; int ans = 1; for (int i = 1 ; i <= n; i++) ans = ans * i ; return ans ;}// Function to find nCrstatic int nCr(int n, int r){ int Nr = n , Dr = 1 , ans = 1; for (int i = 1 ; i <= r ; i++ ) { ans = ( ans * Nr ) / ( Dr ) ; Nr-- ; Dr++ ; } return ans ;}// function to find// the number of waysstatic int solve ( int n ){ int N = 2 * n - 2 ; int R = n - 1 ; return nCr (N, R) * fact(n - 1) ;}// Driver Codepublic static void main (String[] args) {int n = 6 ;System.out.println( solve (n)) ; }}// This code is contributed by anuj_67. |
Python3
# Python3 code to find number# of ways to multiply n # elements with an# associative operation# Function to find the# required factorialdef fact(n): if (n == 0 or n == 1): return 1; ans = 1; for i in range(1, n + 1): ans = ans * i; return ans;# Function to find nCrdef nCr(n, r): Nr = n ; Dr = 1 ; ans = 1; for i in range(1, r + 1): ans = int((ans * Nr) / (Dr)); Nr = Nr - 1; Dr = Dr + 1; return ans;# function to find # the number of waysdef solve ( n ): N = 2* n - 2; R = n - 1 ; return (nCr (N, R) * fact(n - 1));# Driver coden = 6 ;print(solve (n) ); # This code is contributed# by mits |
C#
// C# code to find number of // ways to multiply n elements // with an associative operationusing System;class GFG { // Function to find the // required factorial static int fact(int n) { if (n == 0 || n == 1) return 1 ; int ans = 1; for (int i = 1 ; i <= n; i++) ans = ans * i ; return ans ; } // Function to find nCr static int nCr(int n, int r) { int Nr = n , Dr = 1 , ans = 1; for (int i = 1 ; i <= r ; i++ ) { ans = ( ans * Nr ) / ( Dr ) ; Nr-- ; Dr++ ; } return ans ; } // function to find // the number of ways static int solve ( int n ) { int N = 2 * n - 2 ; int R = n - 1 ; return nCr (N, R) * fact(n - 1) ; } // Driver Code public static void Main () { int n = 6 ; Console.WriteLine( solve (n)) ; }}// This code is contributed by anuj_67. |
PHP
<?php// PHP code to find number// of ways to multiply n // elements with an// associative operation// Function to find the// required factorialfunction fact($n){ if ($n == 0 || $n == 1) return 1; $ans = 1; for ($i = 1 ; $i <= $n; $i++) $ans = $ans * $i; return $ans;}// Function to find nCrfunction nCr($n, $r){ $Nr = $n ; $Dr = 1 ; $ans = 1; for ($i = 1 ; $i <= $r ; $i++ ) { $ans = ($ans * $Nr) / ($Dr); $Nr--; $Dr++; } return $ans ;}// function to find // the number of waysfunction solve ( $n ){ $N = 2* $n - 2 ; $R = $n - 1 ; return nCr ($N, $R) * fact($n - 1) ;}// Driver code$n = 6 ;echo solve ($n) ; // This code is contributed// by ajit?> |
Javascript
<script>// Javascript code to find number of // ways to multiply n elements // with an associative operation// Function to find the// required factorialfunction fact(n){ if (n == 0 || n == 1) return 1; let ans = 1; for(let i = 1 ; i <= n; i++) ans = ans * i; return ans;} // Function to find nCrfunction nCr(n, r){ let Nr = n , Dr = 1 , ans = 1; for(let i = 1 ; i <= r ; i++) { ans = parseInt((ans * Nr) / (Dr), 10); Nr--; Dr++; } return ans;} // Function to find// the number of waysfunction solve(n){ let N = 2 * n - 2; let R = n - 1; return nCr (N, R) * fact(n - 1);}// Driver codelet n = 6;document.write(solve(n)); // This code is contributed by decode2207</script> |
30240
Time Complexity: O(n).
Auxiliary Space: O(1).
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Read More here on that Topic: geeksforgeeks.org/ways-to-multiply-n-elements-with-an-associative-operation/ […]
… [Trackback]
[…] Information to that Topic: geeksforgeeks.org/ways-to-multiply-n-elements-with-an-associative-operation/ […]