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=Ca1b1+Ca1b
这里的数据范围比较小不会MLE故用上面的公式来递推。

C a b 公 式 的 含 义 是 : 表 示 从 a 个 铅 笔 中 选 b 个 铅 笔 的 组 合 数 C_a^b 公式的含义是: 表示从 a个铅笔中选 b个铅笔的组合数 Cab:ab
我们假设a个铅笔标有序号1 2 …到a。那么对于a号铅笔我们可以选或者不选。

  • 当我们确定选a号铅笔时,此时已经选了一个,故我们只需在剩下的(a-1)个铅笔里再选(b-1)个即可。
    即 : C a − 1 b − 1 即: C_{a-1}^{b-1} :Ca1b1
  • 当我们确定不选a号铅笔时,此时已经选了0个,故我们还需在剩下的(a-1)个铅笔里再选b个铅笔。
    即 : C a − 1 b 即: C_{a-1}^{b} :Ca1b

代码如下:

#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的主要内容,如果未能解决你的问题,请参考以下文章

线性求逆元 组合数

杨辉三角求组合数模板

求组合数

另类求组合数

常见的求组合数的板子

求组合数板子