首页 > 其他 > 详细

luoguP2822组合数问题

时间:2018-11-16 22:10:02      阅读:144      评论:0      收藏:0      [点我收藏+]

第一道绿题祭(本人苣蒻

题面如下:

 技术分享图片技术分享图片

 

根据组合恒等式:从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

 

luoguP2822组合数问题

原文:https://www.cnblogs.com/sevenyuanluo/p/9971843.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!