Algoritmo de permutação e combinação (versão atualizada)

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!
Insira a descrição da imagem aqui

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!

Acho que você gosta

Origin blog.csdn.net/Tokai___Teio/article/details/135259931
Recomendado
Clasificación