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

 

posted @ 2018-11-16 21:47  ./seven  阅读(171)  评论(0编辑  收藏  举报