组合数问题
本题是考前缀和,需要注意的是边界的判定,比如本题,并不是取余为0就为0(如0)
所
以
对
于
C
i
i
,
C
0
0
,
C
1
0
,
C
0
1
要
特
殊
计
算
所以对于C_i^i,C_0^0,C_1^0,C_0^1要特殊计算
所以对于Cii,C00,C10,C01要特殊计算
#include<bits/stdc++.h>
using namespace std;
const int N=2020;
int n,m,k;
int C[N][N],ans[N][N];
int main(){
int t;
scanf("%d%d",&t,&k);
C[0][0]=1;
for(int i=1;i<=2000;i++){
C[i][0]=C[0][i]=C[i][i]=1;
for(int j=1;j<i;j++){
C[i][j]=(C[i-1][j-1]+C[i-1][j])%k;
ans[i][j]=((ans[i-1][j]+ans[i][j-1])+((C[i][j]==0)-ans[i-1][j-1]));
}
ans[i][i]=((ans[i-1][i]+ans[i][i-1])-ans[i-1][i-1]);
ans[i][i+1]=ans[i][i];
ans[i+1][i]=ans[i][i];
}
while(t--){
scanf("%d%d",&n,&m);
printf("%d\n",ans[n][min(n,m)]);
}
}