题目描述
给定 n 组询问,每组询问给定两个整数 a,b,请你输出 Cbamod(109+7) 的值。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一组 a 和 b。
输出格式
共 n 行,每行输出一个询问的解。
数据范围
1≤n≤10000,
1≤b≤a≤2000
样例
输入:
3
3 1
5 3
2 2
输出:
3
10
1
算法1
(公式法)
C(i,j)=C(i-1,j)+C(i-1,j-1);
上述公式的理解如下:
给一堆苹果(i个),从中取j个苹果出来
我们可以聚焦于其中任何一个苹果,它是否会被取出,只有两种情况:
1.取
2.不取
我们会发现这样将整个问题的集合划分为上述的两种情况,并且很容易知道这两种情况的累加与整个问题的集合是等价的
1)如果取这个苹果,我们就只需在剩下的i-1个苹果中取出j-1个即可 对应—> C(i-1.j-1)
2)如果不取这个苹果,我们就需在剩下的i-1个苹果中取出i个苹果 对应—> C(i-1.j)
这两种情况是互斥并且完备的,所以将上述两种情况相加,就是我们最终需要求解的结果
时间复杂度 $O(n^2)$
C++ 代码
通过预处理出所有可能查询i,j的情况,在到时候直接从数组中取值即可
#include<bits/stdc++.h>
using namespace std;
const int N=2010;
const int mod = 1e9+7;
int c[N][N];
int main()
{
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]+c[i-1][j-1])%mod;
}
}
int n;
int a,b;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&a,&b);
printf("%d\n",c[a][b]);
}
return 0;
}