组合数:C(n,m)=C(n-1,m-1)+C(n-1,m),类似于杨辉三角,我们可以通过递推把每一项求出来。
题目中求t问,每一问的n,m都是变化的,我们无法通过直接打表的形式。我们可以通过二维前缀和来做。以前其实也学过,但真的忘了,周末再重新整理一下。
最后一点就是代码中的f[i][i+1]=f[i][i],因为类似杨辉三角的分布,如果不写的话会影响f[i-1][j]
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e3+10;
int n,k,t,m,ans;
int c[maxn][maxn],f[maxn][maxn];
void init(){
c[0][0]=1;c[1][0]=1;c[1][1]=1;
for(int i=2;i<=2e3;i++){
c[i][0]=1;
for(int j=1;j<=i;j++){
c[i][j]=(c[i-1][j]%k+c[i-1][j-1]%k)%k;
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
if(!c[i][j])f[i][j]++;
}
f[i][i+1]=f[i][i];
}
return;
}
int main(){
scanf("%d%d",&t,&k);
init();
while(t--){
scanf("%d%d",&n,&m);
printf("%d\n",f[n][min(m,n)]);
}
return 0;
}
周末要好好再看看