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;
}

浙公网安备 33010602011771号