优美的组合数

本文解析了第一类组合数的原理,通过状态转移方程C(mn) = C(m-1n-1) + C(m-1n),并用C(a, b)的计算为例题,展示了如何使用C++实现初始化状态转移方程求解。适合理解组合数计算及动态规划应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组合数

第一类组合数的解决方案

易知组合数表示的是在n个物品中选择m个不同物品的方案的数

C ( m n ) = C ( m − 1 n − 1 ) + C ( m − 1 n ) C\tbinom{m}{n} = C\tbinom{m - 1}{n - 1} + C\tbinom{m - 1}{n} C(nm)=C(n1m1)+C(nm1)
我们可以得到这样的类似于状态转移方程的东西

1.思路

我们可以把其中一种物品的结果拿出来,结果就分成两种

①我们选择的物体被选中,即$ C\tbinom{m - 1}{n }$

②我们选择的物体没有被选中$ C\tbinom{m - 1}{n - 1}$

最后的结果就分为这两种

即满足这种条件。

例题

给定 n 组询问,每组询问给定两个整数 a,b,请你输出 C ( a b ) ( 109 + 7 ) C\tbinom{a}{b}(109+7) C(ba)(109+7) 的值。

题解

#include<bits/stdc++.h>

using namespace std;

const int N = 2010, mod = 1e9 + 7;
int n, a, b;
int c[N][N];

void init()//初始化状态转移方程
{
	for(int i = 0; i < N; i++)
		for(int j = 0;j <= i;j++){
			if(!j)	c[i][j] = 1;
			else c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
		}
}

int main(){
	
	init();
	
	scanf("%d",&n);
	while(n--){
		scanf("%d%d",&a, &b);
		
		cout << c[a][b] << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜狗原来是我自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值