Formas de multiplicar n elementos con una operación asociativa

Dado un número n, encuentre el número de formas de multiplicar n elementos con una operación asociativa.
Ejemplos: 

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

Explicación (Ejemplo 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))

Enfoque: Primero, tratamos de encontrar la relación de recurrencia. De los ejemplos anteriores, podemos ver h(1) = 1, h(2) = 2, h(3) = 12 . Ahora, para n elementos habrá n – 1 multiplicaciones y n – 1 paréntesis. Y, (a1, a2, …, an ) se puede obtener de (a1, a2, …, a(n – 1)) exactamente de una de las dos maneras: 

  1. Toma una multiplicación (a1, a2, …, a(n – 1)) (que tiene n – 2 multiplicaciones y n – 2 paréntesis) e inserta el enésimo elemento ‘an’ a cada lado de cualquiera de los factores en uno de los n – 2 multiplicaciones. Así, para cada esquema para n – 1 números da 2 * 2 * (n – 2) = 4 * (n – 2) esquemas para n números de esta forma.
  2. Tome un esquema de multiplicación para (a1, a2, .., a(n-1)) y multiplique a la izquierda oa la derecha por (‘an’). Así, por cada esquema para n – 1 números da dos esquemas para n números de esta forma.

Luego de sumar los dos anteriores, obtenemos h(n) = (4 * n – 8 + 2) * h(n – 1), h(n) = (4 * n – 6) * h(n – 1) . Esta relación de recurrencia con el mismo valor inicial la satisface el pseudonúmero catalán. Por lo tanto, 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 factorial
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
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
int solve ( int n )
{
    int N = 2*n - 2 ;
    int R = n - 1 ;   
    return nCr (N, R) * fact(n - 1) ;
}
 
// Driver code
int main()
{
    int n = 6 ;
    cout << solve (n) ;   
    return 0 ;
}

Java

// Java code to find number of
// ways to multiply n elements
// with an associative operation
import java.io.*;
 
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 (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 factorial
def 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 nCr
def 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 ways
def solve ( n ):
    N = 2* n - 2;
    R = n - 1 ;
    return (nCr (N, R) *
            fact(n - 1));
 
# Driver code
n = 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 operation
using 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 factorial
function 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 nCr
function 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 ways
function 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 factorial
function 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 nCr
function 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 ways
function solve(n)
{
    let N = 2 * n - 2;
    let R = n - 1;
    return nCr (N, R) * fact(n - 1);
}
 
// Driver code
let n = 6;
document.write(solve(n));
 
// This code is contributed by decode2207
 
</script>
Producción : 

30240

 

Publicación traducida automáticamente

Artículo escrito por MEETPATEL2 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *