排列组合算法(升级版)

前言
在上一期博客中我们分享了一般的排列组合算法(没看的话点这里哦~),但是缺点很明显,没法进行取模运算,而且计算的范围十分有限,而今天分享的排列组合升级版算法能够轻松解决这些问题,话不多说,让我们开始今天的学习吧!
在这里插入图片描述

代码实现
首先我们需要知道这这些公式
C(n,k) = C(n-1,k) + C(n-1,k-1) (C(n,k)指从n个元素中选择k个元素的方式数)
A(n,k) = (n-k)! * c(n,k)
知道了这个公式我们就可以设置数组C[I][J]表示C(I,J),数组A[I][J]表示A(i,j),数组f[i]表示i!,递推公式求得排列组合的值,初始化时,当j为0时,c[i][j]赋值为1,表示从i个元素中选择0个元素只有一种方式;否则,c[i][j] = c[i-1][j] + c[i-1][j-1]表示根据递推关系式计算组合数。其次,通过循环计算阶乘。阶乘f(n)表示从1到n的连续整数的乘积,即n!。最后通过组合数和阶乘的结果来计算排列数。
代码如下:

#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;
}

这就是升级版的排列组合算法,以后在遇见这中类型题想必小伙伴们能够信手捏来,如果觉得博主讲得不错的话,千万不要忘记给博主一个关注,点赞,收藏鼓励一下哦~,我们下期再见!

猜你喜欢

转载自blog.csdn.net/Tokai___Teio/article/details/135259931