C a b 表示从a个苹果中选择b个苹果,假设有一个苹果分开,这个苹果就有选和不选两种方案,分别那么从剩下的a-1个苹果中选择b-1和b个,即 C a-1 b-1 和C a-1 b
数据范围
1≤n≤10000,
1≤b≤a≤2000
n方的复杂度
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7,N=2010;
int n;
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]+c[i-1][j-1])%mod;
}
}
}
int main(){
init();
cin>>n;
while(n--){
int a,b;
cin>>a>>b;
cout<<c[a][b]<<endl;
}
}
为什么预处理的时候,j<=i ?
从i个苹果中取,显然可以取0个,取1个…取i个,所以j的取值范围是0到i
如果C a b 溢出了该怎么办?
题目要求取模了
为什么
c++ for(int i=0;i<N;i++){
这里写成<=N就未知错误了
数组从0开始,最大下标为N-1
但是这个无所谓吧,多预处理几个也一样吧
数组下标最大N-1,循环到=N时数组越界了
哦,好的,谢谢大佬
即 C a b-1 和C a b
应该 C a-1 b-2 和 C a-1 b
感谢
你好同学,请问init()函数里边当i=0的内层循环中c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod 这句话不会出事么。。毕竟i是0了。。i-1就是负数了
当i=0时,j只能等于0,此时在执行c[i][j]=1,不会进入c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod ,所以是没有问题的
懂了,谢谢~