大水题。竟然还WA了几次。。。
打个杨辉三角的表,然后求一个ans 的前缀和就行了。
需要注意的是如果b>a了,b>a的部分就没有意义了。就直接把b赋值成a就行了。
就这个WA了两次、。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int T,K,C[2005][2005],ans[2005][2005];
int main() {
scanf("%d%d",&T,&K);
for(int i=0;i<=2000;i++) C[i][0]=1;
C[1][1]=1;
for(int i=2;i<=2000;i++) {
for(int j=1;j<=i;j++) {
C[i][j]=(C[i-1][j]+C[i-1][j-1])%K;
ans[i][j]=ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1]+(C[i][j]==0);
}
ans[i][i+1]=ans[i][i];
}
int a,b;
while(T--) {
scanf("%d%d",&a,&b);
if(b>a) b=a;
printf("%d
",ans[a][b]);
}
}