通过发现,数据范围只有a, b <= 2000, 故可以预处理出来所有的C(a, b)的组合模以k的结果,查询O(1)时间。
故时间复杂度为O(N^2),空间复杂度(N^2).
代码:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 2020;
int T, k;
int c[N][N], f[N][N];
void init()
{
memset(c, -1, sizeof c); //初始化
for(int i = 0; i < N; i ++ )
for(int j = 0; j <= i; j ++ )
if(i == j || !j) c[i][j] = 1;
else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % k;//k的倍数则为0
//前缀和矩阵
for(int i = 1; i < N; i ++ )
for(int j = 1; j < N; j ++ )
f[i][j] = (c[i][j] == 0) + f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1];
}
int main()
{
cin >> T >> k;
init(); //预处理
while(T -- )
{
int a, b;
cin >> a >> b;
// b = min(a, b);
cout << f[a][b] << endl;
}
return 0;
}
觉得不错给个赞哟👍👍