10和13两个测试点超时????

P2822 [NOIP2016 提高组] 组合数问题

```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


|