Conteo de strings binarias de longitud N que tienen el mismo conteo de 0 y 1

Dado un número entero N , la tarea es encontrar el número de strings binarias posibles de longitud N que tengan la misma frecuencia de 0 s y 1 s. Si tal string es posible de longitud N , imprima -1
Nota: dado que el conteo puede ser muy grande, devuelva la respuesta módulo 10 9 +7 .
Ejemplos: 
 

Entrada: N = 2 
Salida:
Explicación: 
Todas las posibles strings binarias de longitud 2 son «00», «01», «10» y «11». 
Entre ellos, «10» y «01» tienen la misma frecuencia de 0 y 1. 
Por lo tanto, la respuesta es 2.
Entrada:
Salida:
Explicación: 
Las strings «0011», «0101», «0110», «1100», «1010» y «1001» tienen la misma frecuencia de 0 y 1. 
Por lo tanto, la respuesta es 6. 
 

Enfoque ingenuo: 
el enfoque más simple es generar todas las permutaciones posibles de una string de longitud N que tenga el mismo número de ‘0’ y ‘1’ . Por cada permutación generada, aumente el conteo . Imprime el recuento total de permutaciones generadas. 
Complejidad de tiempo: O(N*N!) 
Espacio auxiliar : O(N)
Enfoque eficiente: 
El enfoque anterior se puede optimizar mediante el uso de conceptos de permutación y combinación . Siga los pasos a continuación para resolver el problema: 
 

  • Dado que N posiciones deben llenarse con el mismo número de 0 y 1 , seleccione N/2 posiciones de las N posiciones en C(N, N/2) % mod (donde mod = 10 9 + 7) formas de llenar con sólo 1’s.
  • Rellene las posiciones restantes en C(N/2, N/2) % mod (es decir, 1) con solo 0.

A continuación se muestra la implementación del enfoque anterior:
 

C++

// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
#define MOD 1000000007
 
// Function to calculate C(n, r) % MOD
// DP based approach
int nCrModp(int n, int r)
{
    // Corner case
    if (n % 2 == 1) {
        return -1;
    }
 
    // Stores the last row
    // of Pascal's Triangle
    int C[r + 1];
 
    memset(C, 0, sizeof(C));
 
    // Initialize top row
    // of pascal triangle
    C[0] = 1;
 
    // Construct Pascal's Triangle
    // from top to bottom
    for (int i = 1; i <= n; i++) {
 
        // Fill current row with the
        // help of previous row
        for (int j = min(i, r); j > 0;
            j--)
 
            // C(n, j) = C(n-1, j)
            // + C(n-1, j-1)
            C[j] = (C[j] + C[j - 1])
                % MOD;
    }
 
    return C[r];
}
 
// Driver Code
int main()
{
    int N = 6;
    cout << nCrModp(N, N / 2);
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
 
class GFG{
     
final static int MOD = 1000000007;
     
// Function to calculate C(n, r) % MOD
// DP based approach
static int nCrModp(int n, int r)
{
 
    // Corner case
    if (n % 2 == 1)
    {
        return -1;
    }
 
    // Stores the last row
    // of Pascal's Triangle
    int C[] = new int[r + 1];
 
    Arrays.fill(C, 0);
 
    // Initialize top row
    // of pascal triangle
    C[0] = 1;
 
    // Construct Pascal's Triangle
    // from top to bottom
    for(int i = 1; i <= n; i++)
    {
 
        // Fill current row with the
        // help of previous row
        for(int j = Math.min(i, r);
                j > 0; j--)
 
            // C(n, j) = C(n-1, j)
            // + C(n-1, j-1)
            C[j] = (C[j] + C[j - 1]) % MOD;
    }
    return C[r];
}
 
// Driver Code
public static void main(String s[])
{
    int N = 6;
    System.out.println(nCrModp(N, N / 2));
}
}
 
// This code is contributed by rutvik_56

Python3

# Python3 program to implement
# the above approach
MOD = 1000000007
 
# Function to calculate C(n, r) % MOD
# DP based approach
def nCrModp (n, r):
 
    # Corner case
    if (n % 2 == 1):
        return -1
 
    # Stores the last row
    # of Pascal's Triangle
    C = [0] * (r + 1)
 
    # Initialize top row
    # of pascal triangle
    C[0] = 1
 
    # Construct Pascal's Triangle
    # from top to bottom
    for i in range(1, n + 1):
 
        # Fill current row with the
        # help of previous row
        for j in range(min(i, r), 0, -1):
 
            # C(n, j) = C(n-1, j)
            # + C(n-1, j-1)
            C[j] = (C[j] + C[j - 1]) % MOD
 
    return C[r]
 
# Driver Code
N = 6
 
print(nCrModp(N, N // 2))
 
# This code is contributed by himanshu77

C#

// C# program for the above approach
using System;
 
class GFG{
     
static int MOD = 1000000007;
 
// Function to calculate C(n, r) % MOD
// DP based approach
static int nCrModp(int n, int r)
{
     
    // Corner case
    if (n % 2 == 1)
    {
        return -1;
    }
 
    // Stores the last row
    // of Pascal's Triangle
    int[] C = new int[r + 1];
 
    // Initialize top row
    // of pascal triangle
    C[0] = 1;
 
    // Construct Pascal's Triangle
    // from top to bottom
    for(int i = 1; i <= n; i++)
    {
 
        // Fill current row with the
        // help of previous row
        for(int j = Math.Min(i, r);
                j > 0; j--)
 
            // C(n, j) = C(n-1, j)
            // + C(n-1, j-1)
            C[j] = (C[j] + C[j - 1]) % MOD;
    }
    return C[r];
}
 
// Driver code
static void Main()
{
    int N = 6;
    Console.WriteLine(nCrModp(N, N / 2));
}
}
 
// This code is contributed by divyeshrabadiya07

Javascript

<script>
 
// Javascript program for the above approach
 
    var MOD = 1000000007;
 
    // Function to calculate C(n, r) % MOD
    // DP based approach
    function nCrModp(n , r) {
 
        // Corner case
        if (n % 2 == 1) {
            return -1;
        }
 
        // Stores the last row
        // of Pascal's Triangle
        var C = Array(r + 1).fill(0);
 
     
 
        // Initialize top row
        // of pascal triangle
        C[0] = 1;
 
        // Construct Pascal's Triangle
        // from top to bottom
        for (i = 1; i <= n; i++) {
 
            // Fill current row with the
            // help of previous row
            for (j = Math.min(i, r); j > 0; j--)
 
                // C(n, j) = C(n-1, j)
                // + C(n-1, j-1)
                C[j] = (C[j] + C[j - 1]) % MOD;
        }
        return C[r];
    }
 
    // Driver Code
        var N = 6;
        document.write(nCrModp(N, N / 2));
 
// This code contributed by gauravrajput1
 
</script>
Producción: 

20

 

Complejidad de tiempo: O(N 2
Complejidad de espacio: O(N)
 

Publicación traducida automáticamente

Artículo escrito por math_lover 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 *