```cpp
#include <stdio.h>
#include <cmath>
#include <iostream>
using namespace std;
int c[2005][2005];
int ans[10005];
int t,k,n,m;
int main(){
scanf("%d%d",&t,&k);
for(int i = 0;i < 2001;i++)c[i][0] = 1;
for(int i = 1;i < 2001;i++)
for(int j = 1;j < i+1;j++)
c[i][j] = (c[i-1][j-1]+c[i-1][j])%k;//余数的加法定理
for(int temp = 0;temp < t;temp++){
scanf("%d%d",&n,&m);
for(int i = 0;i <= n;i++)
for(int j = 0;j <= min(i,m);j++)
if(c[i][j] == 0)
ans[temp]++;
}
for(int temp = 0;temp < t;temp++)
printf("%d\n",ans[temp]);
return 0;
}
//c[i][j] = c[i-1][j-1] + c[i-1][j];
```
by WA_orz @ 2018-05-25 10:01:36
对c数组每一行0的数量进行前缀和,预处理出c[i][1~j]=0的数量,询问时就可以免去第二重循环了
by Ebola_test @ 2018-05-25 10:07:46