885. 求组合数 I
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了885. 求组合数 I相关的知识,希望对你有一定的参考价值。
https://www.acwing.com/problem/content/887/
C
a
b
=
C
a
−
1
b
−
1
+
C
a
−
1
b
C_a^b= C_{a-1}^{b-1} + C_{a-1}^b
Cab=Ca−1b−1+Ca−1b
这里的数据范围比较小不会MLE故用上面的公式来递推。
C
a
b
公
式
的
含
义
是
:
表
示
从
a
个
铅
笔
中
选
b
个
铅
笔
的
组
合
数
C_a^b 公式的含义是: 表示从 a个铅笔中选 b个铅笔的组合数
Cab公式的含义是:表示从a个铅笔中选b个铅笔的组合数
我们假设a个铅笔标有序号1 2 …到a。那么对于a号铅笔我们可以选或者不选。
- 当我们确定选a号铅笔时,此时已经选了一个,故我们只需在剩下的(a-1)个铅笔里再选(b-1)个即可。
即 : C a − 1 b − 1 即: C_{a-1}^{b-1} 即:Ca−1b−1 - 当我们确定不选a号铅笔时,此时已经选了0个,故我们还需在剩下的(a-1)个铅笔里再选b个铅笔。
即 : C a − 1 b 即: C_{a-1}^{b} 即:Ca−1b
代码如下:
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long int LL;
const int N=2010,mod=1e9+7;
LL c[N][N];
int n;
void init()
{
for(int i=0;i<=2000;i++)
{
for(int j=0;j<=i;j++)
{
if(j==0) c[i][j]=1;
else c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
}
}
int main(void)
{
cin>>n;
init();
while(n--)
{
int a,b; cin>>a>>b;
cout<<c[a][b]<<endl;//从a个物品中选 b个物品的组合数
}
return 0;
}
以上是关于885. 求组合数 I的主要内容,如果未能解决你的问题,请参考以下文章