Prefácio
No último blog, compartilhamos o algoritmo geral de permutação e combinação ( se você ainda não leu, clique aqui~ ), mas as deficiências são óbvias, é impossível realizar operações modulares e o intervalo de cálculo é muito limitado, e a permutação e combinação compartilhada hoje O algoritmo atualizado pode resolver facilmente esses problemas. Sem mais delongas, vamos começar a aprender hoje!
Implementação de código
Primeiro, precisamos conhecer essas fórmulas
C(n,k) = C(n-1,k) + C(n-1,k-1) (C(n,k) refere-se à seleção de k do número de n elementos de elementos)
A(n,k) = (nk)! * c(n,k)
Conhecendo esta fórmula, podemos definir o array C[I][J] para representar C(I,J), e o array A [I][J] representa A(i,j) e o array f[i] representa i! , a fórmula recursiva obtém o valor da permutação e combinação. Durante a inicialização, quando j é 0, c[i][j] recebe o valor 1, o que significa que só há uma maneira de selecionar 0 elementos de i elementos ; caso contrário, c[ i][j] = c[i-1][j] + c[i-1][j-1] significa calcular o número de combinações com base na relação de recursão. Segundo, calcule o fatorial em loop. O fatorial f(n) representa o produto de inteiros consecutivos de 1 a n, ou seja, n!. Finalmente, o número de permutação é calculado combinando o número e o resultado fatorial.
código mostrado abaixo:
#include<stdio.h>
#define mod 1000000007//模数
int C[1145][1145];//组合
long long F[1145];//结成
int A[1145][1145];//排列
void combination(int n)
{
for (int i = 0; i < n; i++)//当j = 0时直接初始化为1
{
C[i][0] = 1;
}
for (int i = 1; i < n; i++)//递推公式求组合数
{
for (int j = 1; j <= i; j++)
{
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
}
}
}
void factorial(int n)
{
F[0] = 1;
for (int i = 1; i < n; i++)//求结成
{
F[i] = F[i - 1] * i % mod;
}
}
void permutation(int n)
{
for (int i = 0; i < n; i++)//递推公式求排列数
{
for (int j = 0; j <= i; j++)
{
A[i][j] = F[i - j] * C[i][j] % mod;
}
}
}
int main()
{
int n = 1145;
combination(n);
factorial(n);
permutation(n);
return 0;
}
Esta é a versão atualizada do algoritmo de permutação e combinação. No futuro, os amigos poderão responder facilmente a esse tipo de pergunta. Se você acha que as palavras do blogueiro são boas, não se esqueça de seguir o blogueiro, como , e coleção para incentivá-lo. ~, até a próxima!