ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

hdu7047 /2021“MINIEYE杯”中国大学生算法设计超级联赛(7) 1004 Link with Balls

2021-09-05 15:31:28  阅读:284  来源: 互联网

标签:hdu7047 Balls int inv A1 1ll Link 个球 mod


https://acm.hdu.edu.cn/showproblem.php?pid=7047

 

题意:

2*n个筐,每个筐里的球个数无限。第2*x个框至多取x个球,第2*x-1个框只能取x的倍数个球。

问取出m个球的方案数

 

至多取x-1个球的筐和只能取x的倍数个球的筐放在一起可以看作是可以取任意个球的筐

所以第2个筐到第2n-1个筐构成了n-1个可以取任意球的筐,第1个筐也是可以取任意球,第2n个筐可以取0—n个球

所以相当于n个可以取任意球的筐和1个可以取0—n个球的筐

枚举从可以取0—n个球的筐中取i个

那就是在n个筐里任意取够m-i个球

根据组合数学中的插板法,答案是C(m-i+n-1,n-1)

所以答案是∑ C(m-i+n-1,n-1)  i∈[0,min(n,m)]

∑ C(m-i+n-1,n-1) = C(m-1,n-1)+C(m,n-1)+C(m+1,n-1)+……+C(m+n-1,n-1)

相当于问杨辉三角第n-1列,第m-1行到第m+n-1行的和

由A1+C=B得 A1=B-C

所以A1+A2+A3+A4=B-C+A2+A3+A4=B+A2+A3+A4-C=D-C

所以∑ C(m-i+n-1,n-1) = C(m+n,n)-C(m-1,n)

 

 

#include<bits/stdc++.h>

using namespace std;

#define N 2000001

const int mod=1e9+7;

int fac[N],inv[N];

int poww(int a,int b)
{
    int c=1;
    for(;b;b>>=1,a=1ll*a*a%mod)
        if(b&1) c=1ll*c*a%mod;
    return c;
}

int C(int n,int m)
{
    if(n<m) return 0;
    int w=1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;
    return w;
}

int main()
{
    fac[0]=1;
    for(int i=1;i<N;++i) fac[i]=1ll*fac[i-1]*i%mod;
    inv[N-1]=poww(fac[N-1],mod-2);
    for(int i=N-2;i>=0;--i) inv[i]=1ll*inv[i+1]*(i+1)%mod;  
    int T,n,m;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        printf("%d\n",(C(n+m,n)-C(m-1,n)+mod)%mod); 
    }
}

 

标签:hdu7047,Balls,int,inv,A1,1ll,Link,个球,mod
来源: https://www.cnblogs.com/TheRoadToTheGold/p/15229530.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有