https://www.acwing.com/problem/content/887/
$$C_a^b= C_{a-1}^{b-1} + C_{a-1}^b $$
这里的数据范围比较小不会MLE故用上面的公式来递推。
$$C_a^b 公式的含义是: 表示从 a个铅笔中选 b个铅笔的组合数$$
我们假设a个铅笔标有序号1 2 …到a。那么对于a号铅笔我们可以选或者不选。
+ 当我们确定选a号铅笔时,此时已经选了一个,故我们只需在剩下的(a-1)个铅笔里再选(b-1)个即可。
$$即: C_{a-1}^{b-1}$$
+ 当我们确定不选a号铅笔时,此时已经选了0个,故我们还需在剩下的(a-1)个铅笔里再选b个铅笔。
$$即: C_{a-1}^{b}$$
代码如下:
#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;
}