这么水的题我居然还调了好几次......
对于所有询问,k都是一样的。
所以先用杨辉三角求出2000以内所有组合数mod k的值c[i][j]。
如果c[i][j]%k==0,那么c[i][j]对答案的贡献f[i][j]就是1。
最后对f[i][j]求个前缀和就好了。
1 #include<cstdio> 2 3 int t,k,n,m; 4 int c[2005][2005]; 5 int f[2005][2005]; 6 7 int main() 8 { 9 scanf("%d%d",&t,&k); 10 c[0][0]=1%k; 11 for(int i=1;i<=2000;i++) 12 { 13 c[i][0]=1%k; 14 for(int j=1;j<=i;j++) 15 { 16 c[i][j]=(c[i-1][j]+c[i-1][j-1])%k; 17 } 18 } 19 for(int i=0;i<=2000;i++) 20 { 21 for(int j=0;j<=i;j++) 22 { 23 if(!c[i][j])f[i][j]=1; 24 } 25 } 26 for(int i=1;i<=2000;i++) 27 { 28 f[i][0]+=f[i-1][0]; 29 for(int j=1;j<=2000;j++) 30 { 31 f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1]; 32 } 33 } 34 for(int i=1;i<=t;i++) 35 { 36 scanf("%d%d",&n,&m); 37 if(m>n)m=n; 38 printf("%d ",f[n][m]); 39 } 40 return 0; 41 }