luoguP2822组合数问题
第一道绿题祭(本人苣蒻
题面如下:
根据组合恒等式:从n个物品中取出m个物品——C(n,m)=C(n,n-m)=C(m-1,n-1)+C(m,n-1)
【推导推荐百度 |-|
这样我们就可以写出递推的代码
首先不能忘记初始化C(0,0)=0
C(1,0)=C(n,0)=C(1,1)=1
然后放代码
#include<cstdio> #include<algorithm> using namespace std; int c[2010][2010]; int ans[2001][2001]; int main() { int n,m,k,a; scanf("%d%d",&a,&k); c[0][0]=0; c[1][0]=1; c[1][1]=1;//初始化 for(int i=2; i<=2000; i++) { c[i][0]=1;//初始化 for(int j=1; j<=i; j++) { c[i][j]=(c[i-1][j-1]%k+c[i-1][j]%k)%k;//递推,注意c[i][j]可能很大,要适当模k ans[i][j]=ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1];//前缀和 if(!c[i][j])ans[i][j]++; } ans[i][i+1]=ans[i][i]; } for(int s=0; s<a; s++) { scanf("%d%d",&n,&m); if(m>n)m=n; printf("%d\n",ans[n][m]); } }
//才不告诉你们本苣蒻什么都不会代码是(学长写的
//等哪天能懂了再回来写题解(悄咪咪立flag