前言
在上一期博客中我们分享了一般的排列组合算法(没看的话点这里哦~),但是缺点很明显,没法进行取模运算,而且计算的范围十分有限,而今天分享的排列组合升级版算法能够轻松解决这些问题,话不多说,让我们开始今天的学习吧!
代码实现
首先我们需要知道这这些公式
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;
}
这就是升级版的排列组合算法,以后在遇见这中类型题想必小伙伴们能够信手捏来,如果觉得博主讲得不错的话,千万不要忘记给博主一个关注,点赞,收藏鼓励一下哦~,我们下期再见!