【正经题解】组合数问题
2024-02-22 13:28:00
发布于:浙江
15阅读
0回复
0点赞
首先我们来看一个有趣的东西
是不是很眼熟!!这就是一个杨辉三角
所以 ( , )的值就是第 行第 列
预处理的时候膜? 就好了
那么问题来了,预处理好杨辉三角形,还有 组询问怎么办?
我们可以用矩阵和(就是下面的 数组)给个口诀吧,上加左 减左上 加自己
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int t,k,n,m;
int c[2005][2005],s[2005][2005];
void prepare();
int main(){
// freopen("problem.in","r",stdin);
// freopen("problem.out","w",stdout);
memset(c,0,sizeof(c));
memset(s,0,sizeof(s));
cin>>t>>k;
prepare();
while(t--){
cin>>n>>m;
if(m>n) m=n;
cout<<s[n][m]<<endl;
}
return 0;
}
void prepare(){
c[1][1]=1;
for(int i=0;i<=2000;i++) c[i][0]=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=2;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];
}
}
这里空空如也
有帮助,赞一个