題目
題
輸入 輸出
思路
一個範圍
求二維 的前綴和
二維前綴和公式
如何快速求一個組合數是否能整除k?
組合數的遞推式
代碼
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 2010;
int c[N][N];
int s[N][N];
int main()
{
int T,k;
cin >> T >> k;
for(int i = 0; i < N;i++)
for(int j = 0;j <= i;j++)
{
if(!j) c[i][j] = 1 % k;
else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % k;
}
for(int i = 0;i < N;i++)
{
for(int j = 0;j < N;j++)
{
if(j <= i && c[i][j] == 0) s[i][j] = 1;
if(i - 1 >= 0) s[i][j] += s[i - 1][j];
if(j - 1 >= 0) s[i][j] += s[i][j - 1];
if(i - 1 >= 0 && j - 1 >= 0) s[i][j] -= s[i - 1][j - 1];
}
}
while(T--)
{
int n,m;
cin >> n >> m;
cout << s[n][m] << endl;
}
return 0;
}