Dados dos enteros N y K . Hay N bolas colocadas en fila. K de ellos son verdes y N – K de ellos son negros. La tarea es encontrar el número de formas de organizar N bolas de modo que se necesiten exactamente i ( 1 ≤ i ≤ K ) movimientos para recoger todas las bolas verdes. En un solo movimiento, podemos recoger cualquier grupo de bolas verdes consecutivas. Tenga en cuenta que la respuesta puede ser muy grande. Entonces, salida respuesta módulo 10 9 + 7 .
Ejemplos:
Entrada: N = 5, K = 3
Salida: 3 6 1
Hay tres formas de colocar las bolas para que
se necesite exactamente un movimiento:
(G, G, G, B, B), (B, G, G, G, B) y (B, B, G, G, G).
Hay seis formas de colocar las bolas para que
se necesiten exactamente dos movimientos:
(G, G, B, G, B), (G, G, B, B, G), (B, G, G, B, G), (B, G, B, G, G),
(G, B, G, G, B) y (G, B, B, G, G).
Solo hay una forma de colocar las bolas de modo que
se necesiten exactamente tres movimientos: (G, B, G, B, G).Entrada: N = 100, K = 5
Salida: 96 18240 857280 13287840 61124064
Enfoque: Solo se deben realizar i movimientos para recolectar K bolas verdes, lo que significa que las K bolas verdes están separadas en i lugares por bolas negras. Por lo tanto, consideremos la combinación de la siguiente manera.
- Primero, coloque las bolas negras N – K en una fila.
- Entre estas bolas negras, seleccione i lugares desde el extremo izquierdo hasta el extremo derecho y considere colocar K bolas verdes allí. Hay N – K + 1 C i formas de elegirlas.
- Para cada opción, considere cuántas bolas verdes se asignarán a cada espacio. Dado que es necesario asignar uno o más a cada uno, hay K – 1 C i – 1 formas de determinar esto.
Por lo tanto, para cada i , la respuesta es N – K + 1 C i * K – 1 C i – 1 . Encontrar n C r se discute aquí .
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; #define N 100005 #define mod (int)(1e9 + 7) // To store the factorial and the // factorial mod inverse of a number int factorial[N], modinverse[N]; // Function to find (a ^ m1) % mod int power(int a, int m1) { if (m1 == 0) return 1; else if (m1 == 1) return a; else if (m1 == 2) return (1LL * a * a) % mod; else if (m1 & 1) return (1LL * a * power(power(a, m1 / 2), 2)) % mod; else return power(power(a, m1 / 2), 2) % mod; } // Function to find factorial // of all the numbers void factorialfun() { factorial[0] = 1; for (int i = 1; i < N; i++) factorial[i] = (1LL * factorial[i - 1] * i) % mod; } // Function to find the factorial // mod inverse of all the numbers void modinversefun() { modinverse[N - 1] = power(factorial[N - 1], mod - 2) % mod; for (int i = N - 2; i >= 0; i--) modinverse[i] = (1LL * modinverse[i + 1] * (i + 1)) % mod; } // Function to return nCr int binomial(int n, int r) { if (r > n) return 0; int a = (1LL * factorial[n] * modinverse[n - r]) % mod; a = (1LL * a * modinverse[r]) % mod; return a; } // Function to find ways to arrange K green // balls among N balls such that we need // exactly i moves to collect all K green balls void arrange_balls(int n, int k) { factorialfun(); modinversefun(); for (int i = 1; i <= k; i++) cout << (1LL * binomial(n - k + 1, i) * binomial(k - 1, i - 1)) % mod << " "; } // Driver code int main() { int n = 5, k = 3; // Function call arrange_balls(n, k); return 0; }
Python3
# Python3 implementation of the approach N = 100005 mod = (int)(1e9 + 7) # To store the factorial and the # factorial mod inverse of a number factorial = [0] * N; modinverse = [0] * N; # Function to find (a ^ m1) % mod def power(a, m1) : if (m1 == 0) : return 1; elif (m1 == 1) : return a; elif (m1 == 2) : return (a * a) % mod; elif (m1 & 1) : return (a * power(power(a, m1// 2), 2)) % mod; else : return power(power(a, m1 // 2), 2) % mod; # Function to find factorial # of all the numbers def factorialfun() : factorial[0] = 1; for i in range(1, N) : factorial[i] = (factorial[i - 1] * i) % mod; # Function to find the factorial # mod inverse of all the numbers def modinversefun() : modinverse[N - 1] = power(factorial[N - 1], mod - 2) % mod; for i in range(N - 2 , -1, -1) : modinverse[i] = (modinverse[i + 1] * (i + 1)) % mod; # Function to return nCr def binomial(n, r) : if (r > n) : return 0; a = (factorial[n] * modinverse[n - r]) % mod; a = (a * modinverse[r]) % mod; return a; # Function to find ways to arrange K green # balls among N balls such that we need # exactly i moves to collect all K green balls def arrange_balls(n, k) : factorialfun(); modinversefun(); for i in range(1, k + 1) : print((binomial(n - k + 1, i) * binomial(k - 1, i - 1)) % mod, end = " "); # Driver code if __name__ == "__main__" : n = 5; k = 3; # Function call arrange_balls(n, k); # This code is contributed by AnkitRai01
Java
// Java implementation of the approach import java.util.*; class GFG{ static final int N = 100005; static final int mod = (int)(1e9 + 7); // To store the factorial and the // factorial mod inverse of a number static long []factorial = new long[N]; static long []modinverse = new long[N]; // Function to find (a ^ m1) % mod static long power(long a, int m1) { if (m1 == 0) return 1; else if (m1 == 1) return a; else if (m1 == 2) return (1L * a * a) % mod; else if (m1 %2== 1) return (1L * a * power(power(a, m1 / 2), 2)) % mod; else return power(power(a, m1 / 2), 2) % mod; } // Function to find factorial // of all the numbers static void factorialfun() { factorial[0] = 1; for (int i = 1; i < N; i++) factorial[i] = (1L * factorial[i - 1] * i) % mod; } // Function to find the factorial // mod inverse of all the numbers static void modinversefun() { modinverse[N - 1] = (int) (power(factorial[N - 1], mod - 2) % mod); for (int i = N - 2; i >= 0; i--) modinverse[i] = (1 * modinverse[i + 1] * (i + 1)) % mod; } // Function to return nCr static long binomial(int n, int r) { if (r > n) return 0; long a = (1L * factorial[n] * modinverse[n - r]) % mod; a = (1 * a * modinverse[r]) % mod; return a; } // Function to find ways to arrange K green // balls among N balls such that we need // exactly i moves to collect all K green balls static void arrange_balls(int n, int k) { factorialfun(); modinversefun(); for (int i = 1; i <= k; i++) System.out.print((1L * binomial(n - k + 1, i) * binomial(k - 1, i - 1)) % mod + " "); } // Driver code public static void main(String[] args) { int n = 5, k = 3; // Function call arrange_balls(n, k); } } // This code contributed by Princi Singh
C#
// C# implementation of the approach using System; class GFG{ static readonly int N = 100005; static readonly int mod = (int)(1e9 + 7); // To store the factorial and the // factorial mod inverse of a number static long []factorial = new long[N]; static long []modinverse = new long[N]; // Function to find (a ^ m1) % mod static long power(long a, int m1) { if (m1 == 0) return 1; else if (m1 == 1) return a; else if (m1 == 2) return (1L * a * a) % mod; else if (m1 % 2 == 1) return (1L * a * power(power(a, m1 / 2), 2)) % mod; else return power(power(a, m1 / 2), 2) % mod; } // Function to find factorial // of all the numbers static void factorialfun() { factorial[0] = 1; for(int i = 1; i < N; i++) factorial[i] = (1L * factorial[i - 1] * i) % mod; } // Function to find the factorial // mod inverse of all the numbers static void modinversefun() { modinverse[N - 1] = (int)(power(factorial[N - 1], mod - 2) % mod); for(int i = N - 2; i >= 0; i--) modinverse[i] = (1 * modinverse[i + 1] * (i + 1)) % mod; } // Function to return nCr static long binomial(int n, int r) { if (r > n) return 0; long a = (1L * factorial[n] * modinverse[n - r]) % mod; a = (1 * a * modinverse[r]) % mod; return a; } // Function to find ways to arrange K green // balls among N balls such that we need // exactly i moves to collect all K green balls static void arrange_balls(int n, int k) { factorialfun(); modinversefun(); for(int i = 1; i <= k; i++) Console.Write((1L * binomial(n - k + 1, i) * binomial(k - 1, i - 1)) % mod + " "); } // Driver code public static void Main(String[] args) { int n = 5, k = 3; // Function call arrange_balls(n, k); } } // This code is contributed by 29AjayKumar
3 6 1
Publicación traducida automáticamente
Artículo escrito por pawan_asipu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA