【洛谷 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) 的区域。

我们可以使用前缀和来对此进行优化。

至于怎么用,推荐博客..

 

 

posted @ 2018-02-15 14:19  E-Valley  阅读(311)  评论(0)    收藏  举报