【题目链接】
【算法】
杨辉三角 + 二维前缀和
O(1)计算答案
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXNM 2010 int i,j,n,m,tc,k; int s[MAXNM+10][MAXNM+10],c[MAXNM+10][MAXNM+10]; int main() { cin >> tc >> k; for (i = 0; i <= MAXNM; i++) c[i][0] = c[i][i] = 1; for (i = 1; i <= MAXNM; i++) { for (j = 1; j < i; j++) { c[i][j] = (c[i-1][j] + c[i-1][j-1]) % k; } } for (i = 1; i <= MAXNM; i++) { for (j = 1; j <= MAXNM; j++) { s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1]; if ((!c[i][j]) && (j <= i)) s[i][j]++; } } while (tc--) { cin >> n >> m; cout<< s[n][m] << endl; } return 0; }