计算系数 知识点:递推组合式 二项式定理

208 阅读1分钟

211. 计算系数 - AcWing题库

视频解析:AcWing 211. 计算系数(每日一题)_哔哩哔哩_bilibili

解析

(ax+by)k(ax+by)^{k}可以看作k个(ax+by)(ax+by)相乘: image.png

那么一共有多少种取法呢?

首先一共k个,要取n个x,所以有Ck^{n}个取法,又因为有n位取x项,k-n位取y项,所以一共有: image.png

转移

系数部分就是CknanbmCk^{n}a^{n}b^{m}

image.png

至于排列数怎么求,有很多种求法,本题n最大1000,数据范围很小,可以用递推法来求排列数。 递推求排列数就是:C(a1)b1CabC(a-1)^{b-1}*Ca^{b}

image.png

原理:假设要从a个苹果里选b个苹果。我们假设选第一个苹果,那么就要从剩下的a-1个苹果中选b-1个苹果。否则如果不选第1个苹果,那么就要从剩下的a-1个苹果里选b个苹果。

#include<bits/stdc++.h>
#define MOD 10007
using namespace std;
const int N=10010;
int C[N][N];
int main()
{
    int  a,b,k,n,m;cin>>a>>b>>k>>n>>m;
	a%=MOD,b%=MOD;
	for(int i=0;i<=k;i++)
	{
		for(int j=0;j<=i;j++)
		{
			if(!j)C[i][j]=1;  //只有1种组合
			else  C[i][j]=(C[i-1][j-1]+C[i-1][j])%MOD;   //递推 
		}
	}
	
	int res=C[k][n];
	
	//然后还要乘n个a,m个b
	for(int i=0;i<n;i++)res=res*a%MOD;
	for(int i=0;i<m;i++)res=res*b%MOD;
	
	cout<<res; 
	 
	return 0;
}