【洛谷 2822】组合数问题 | 前缀和、杨辉三角与组合数
luogu传送门
推荐dalao的博客。
——90%
杨辉三角求组合数,按照题目扫一遍 0 <= i <= n,0 <= j <= min(i,m) 的区域,计算ans就可以了。
#include <cstdio> #include <algorithm> const int MAXN = 2007; int n, m, t, k, f[MAXN][MAXN], sum[MAXN][MAXN]; void fs() { for (int i = 0; i < MAXN; i++) f[i][0] = 1; // 注意初始化!!!!!! for (int i = 1; i < MAXN; i++) for (int j = 1; j < MAXN; j++) f[i][j] = (f[i - 1][j] + f[i - 1][j - 1]) % k; } int main() { scanf("%d%d", &t, &k); fs(); // // for(int i = 0; i < 10; i++) { // for (int j = 0; j < 10; j++) printf("%d ", f[i][j]); // printf("\n"); // } while (t--) { int ans = 0; scanf("%d%d", &n, &m); for (int i = 0; i <= n; i++) for (int j = 0; j <= std::min(i, m); j++) if (f[i][j] == 0) ans++; printf("%d\n", ans); } return 0; }然后你就会发现,在 10 和 13 测试点 T 了。
——100%
那就要在 90% 的基础上进行优化。
首先考虑应该在哪里优化。
90%的做法中,每一次都需要扫一遍 0 <= i <= n,0 <= j <= min(i,m) 的区域。
我们可以使用前缀和来对此进行优化。
至于怎么用,推荐博客..

浙公网安备 33010602011771号