排列组合
组合公式
#include<bits/stdc++.h>
using namespace std;
const int N=2010;
int a[N][N],b[N][N];//a储存模k的余数,b储存是否为k的倍数
int main(){
int t,k;
scanf("%d%d",&t,&k);
for(int i=0;i<N;i++){
for(int j=0;j<=i;j++){
if(!j) a[i][j]=1;//当j为0时模为1
else a[i][j]=(a[i-1][j-1]+a[i-1][j])%k;//排列组合公式C(m,n)=C(m-1,n-1)+C(m-1,n)
if(!a[i][j]) b[i][j]=1;//为k的倍数时储存1
}
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(i) b[i][j]+=b[i-1][j];//行累加
if(j) b[i][j]+=b[i][j-1];//列累加
if(i&&j) b[i][j]-=b[i-1][j-1];//此时重复了b[i-1][j-1];
}
}
int n,m;
while(t--){
scanf("%d%d",&n,&m);
printf("%d\n",b[n][m]);
}
return 0;
}
京公网安备 11010502036488号