题目描述

\(m\)个猴子分\(n\)个桃,要求第一个猴子的桃数严格大于其他猴子,问有多少种分法对\(1e9+7取模(\%1e9+7)\)

Input

\(1≤T≤25 ,1≤n,m≤100000\)

第一行是\(T\),之后\(T\)行,输入\(n\),\(m\)

Output

输出每组数据的分发数

Sample Input

2
2 2
3 5

Sample Output

1
5

先来看一下基础的版本,即\(m\)个猴子分\(n\)个桃子,这我们可以利用隔板法解决,

答案就是\(C(m+n-1,m)\);

现在,我们加入了限制条件,第一只猴子数量大于等于其他猴子的数量。

我们发现\(n\)实际上并不是很大,于是便很容易想到通过枚举第一只猴子拿桃子的数量进行求解。

对于我们当前枚举猴子拿的桃子的数量\(x\),我们再枚举拿桃子数量何其相同的猴子的数量。

我们定义:\(F(i,j)\)表示\(i\)个猴子分\(j\)个桃子的方案数。

假设,当前至少有\(i\)只猴子拿桃子的数量大于等于第一只的数量,让我们来计算方案数。

第一只猴子拿完后还剩\(n-x\)个桃子,有\(i\)只猴子拿至少\(x\)个,剩下\(n-x-i*x\)个桃子分给\(m-1\)个猴子。

即\(F(m-1,n-(i+1)*x)\),当\(n<(i+1)*x\)时\(return\)掉。

由于我们求出的是至少\(i\)只猴子的数量大于等于第一只的方案数,那么我们就可以容斥求解。

\(Ans=\)至少\(0\)只猴子的数量-至少\(1\)只猴子的数量+至少\(2\)只猴子的数量.....-至少\(n\)只猴子的数量.

同时,我们需要注意的是若\(m-1\)个猴子分\(n-x\)个桃子每只猴子分到的桃子数量已经\(>=x\)了,

那么说明无论怎样第一只猴子都不会是最多的(即\(x<=(n-x+m-2)/(m-1)\))就要\(return\)掉。

代码如下

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define reg register
#define clr(a,b) memset(a,b,sizeof a)
#define Raed Read
#define Mod(x) (x>=mod)&&(x-=mod)
#define debug(x) cerr<<#x<<" = "<<x<<endl;
#define rep(a,b,c) for(reg int a=(b),a##_end_=(c); a<=a##_end_; ++a)
#define ret(a,b,c) for(reg int a=(b),a##_end_=(c); a<a##_end_; ++a)
#define drep(a,b,c) for(reg int a=(b),a##_end_=(c); a>=a##_end_; --a)
#define erep(i,G,x) for(int i=(G).Head[x]; i; i=(G).Nxt[i]) inline int Read(void) {
int res=0,f=1;
char c;
while(c=getchar(),c<48||c>57)if(c=='-')f=0;
do res=(res<<3)+(res<<1)+(c^48);
while(c=getchar(),c>=48&&c<=57);
return f?res:-res;
} template<class T>inline bool Min(T &a, T const&b) {
return a > b ? a = b, 1 : 0;
}
template<class T>inline bool Max(T &a, T const&b) {
return a < b ? a = b, 1 : 0;
} const int N=2e5+5,M=6005,mod=1e9+7; bool MOP1; int Fac[N]; inline int Pow(int x,int y) {
int res=1;
while(y) {
if(y&1)res=(res*x)%mod;
x=(x*x)%mod,y>>=1;
}
return res;
} inline int C(int x,int y) {
return Fac[x]*Pow(Fac[x-y]*Fac[y]%mod,mod-2)%mod;
} inline int F(int x,int y) {
return C(x+y-1,x);
} bool MOP2; inline void _main() {
Fac[0]=1;
ret(i,1,N)Fac[i]=(Fac[i-1]*i)%mod;
int T=Read();
while(T--) {
int n=Read(),m=Read(),Ans=0;
if(n==1||m==1) {
puts("1");
continue;
}
rep(x,1,n) {
int Ma=(n-x+m-2)/(m-1);
if(x<=Ma)continue;
rep(i,0,n) {
if(n<(i+1)*x)break;
int res=C(m-1,i)*F(n-(i+1)*x,m-1)%mod;
if(i&1)Ans-=res-mod;
else Ans+=res;
Mod(Ans);
}
}
printf("%lld\n",Ans);
}
} signed main() {
_main();
return 0;
}

HDU-5201 The Monkey King的更多相关文章

  1. hdu 5201 The Monkey King【容斥原理+组合数学】

    原来我一开始以为的\( O(n^2) \)是调和级数\( O(nlog_2n) \)的! 首先枚举猴王的桃子个数\( x \),然后使用容斥原理,枚举有至少\( k \)个不满足的条件,那么这\( k ...

  2. HDU - 1512  Monkey King

    Problem Description Once in a forest, there lived N aggressive monkeys. At the beginning, they each ...

  3. HDU - 5201 :The Monkey King (组合数 & 容斥)

    As everyone known, The Monkey King is Son Goku. He and his offspring live in Mountain of Flowers and ...

  4. 数据结构(左偏树):HDU 1512 Monkey King

    Monkey King Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  5. ZOJ 2334 Monkey King

    并查集+左偏树.....合并的时候用左偏树,合并结束后吧父结点全部定成树的根节点,保证任意两个猴子都可以通过Find找到最厉害的猴子                       Monkey King ...

  6. P1456 Monkey King

    题目地址:P1456 Monkey King 一道挺模板的左偏树题 不会左偏树?看论文打模板,完了之后再回来吧 然后你发现看完论文打完模板之后就可以A掉这道题不用回来了 细节见代码 #include ...

  7. Monkey King(左偏树 可并堆)

    我们知道如果要我们给一个序列排序,按照某种大小顺序关系,我们很容易想到优先队列,的确很方便,但是优先队列也有解决不了的问题,当题目要求你把两个优先队列合并的时候,这就实现不了了 优先队列只有插入 删除 ...

  8. 1512 Monkey King

    Monkey King Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  9. The Monkey King(hdu5201)

    The Monkey King Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  10. hdu 1512 Monkey King 左偏树

    题目链接:HDU - 1512 Once in a forest, there lived N aggressive monkeys. At the beginning, they each does ...

随机推荐

  1. 清除eclipse 里面主函数的加载记录 launch configuration删除

    我们eclipse  里面执行的程序,应用 把他记录下来,生成配置文件. 当我们导出行的jar包的时候,需要制定运行的主函数. 会看到很多的历史主程序,带来方便的同时,也产生了影响. 需要清除写记录的 ...

  2. jquery isDefaultPrevented()方法 语法

    jquery isDefaultPrevented()方法 语法 作用:isDefaultPrevented() 方法返回指定的 event 对象上是否调用了 preventDefault() 方法. ...

  3. luoguP1772 [ZJOI2006]物流运输 x

    P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...

  4. Spark译文(三)

    Structured Streaming Programming Guide(结构化流编程指南) Overview(概貌) ·Structured Streaming是一种基于Spark SQL引擎的 ...

  5. 如何将项目托管到Github上

    将本地项目放到GitHub上托管并展示 传送门 利用Github Pages展示自己的项目 传送门 git Please tell me who you are解决方法 传送门 git config ...

  6. C++入门经典-例6.7-字符串比较

    1:strcmp函数,用于比较两个字符串.格式如下: strcmp(字符数组名1,字符数组名2) 按照ASCII码,按顺序比较两个数组中的字符,并由函数返回值返回比较结果的执行过程. (1)各自选中自 ...

  7. TCP定时器 之 连接建立定时器

    当服务器收到新的syn请求,会回复syn+ack给请求端,若某时间内未收到请求端回复的ack,新建连接定时器超时执行回调,重传syn+ack,当超时超过固定次数时,该连接中止:本文主要分析其初始化流程 ...

  8. leetcode-easy-array-136. Single Number

    mycode   75.80% class Solution(object): def singleNumber(self, nums): """ :type nums: ...

  9. 【flask】flask项目配置 app.config

    [理论] 在很多情况下,你需要设置程序的某些行为,这时你就需要使用配置变量.在Flask中,配置变量就是一些大写形式的Python变量, 你也可以称之为配置参数或配置键.使用统一的配置变量可以避免在程 ...

  10. python 实验2 分支结构

    该博客专为我的小伙伴们提供参考而附加,没空加上代码具体解析,望各位谅解 实验一   货币转换   ‪‪‪‪‪‫‪‪‪‪‪写一个程序进行人民币和欧元间币值转换,其中:‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‫ ...