!-- Loading 底层遮罩 -->

P2822 组合数问题

传送门

思路

把组合数依次排列开可以得到一个杨辉三角,具有杨辉三角的递推式。结合二维前缀和可以得到一个组合数区间的总和。

代码

#include<iostream>
using namespace std;
int C[2005][2005], S[2005][2005];
int t, k, n, m;
int main(void)
{
    scanf("%d %d", &t, &k);
    for (int i = 1; i <= 2000; i++)
    {
        C[i][0] = C[i][i] = 1;
    }
    for (int i = 2; i <= 2000; i++)
    {
        for (int j = 1; j < i; j++) {
            C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % k;
        }
    }
    for (int i = 1; i <= 2000; i++) {
        for (int j = 1; j <= i; j++) {
            S[i][j] = S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1];
            if (C[i][j] == 0) S[i][j] += 1;
        }
        S[i][i + 1] = S[i][i];
    }
    for(int i=1;i<=t;i++)
    {  
        scanf("%d %d", &n, &m);
        if (m > n) m = n;
        printf("%d\n", S[n][m]);
    }
    return 0;
}
 

 

posted @ 2022-03-30 21:21  Thinker-X  阅读(22)  评论(0)    收藏  举报