HDU-5201 The Monkey King
题目描述
\(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的更多相关文章
- hdu 5201 The Monkey King【容斥原理+组合数学】
原来我一开始以为的\( O(n^2) \)是调和级数\( O(nlog_2n) \)的! 首先枚举猴王的桃子个数\( x \),然后使用容斥原理,枚举有至少\( k \)个不满足的条件,那么这\( k ...
- HDU - 1512 Monkey King
Problem Description Once in a forest, there lived N aggressive monkeys. At the beginning, they each ...
- HDU - 5201 :The Monkey King (组合数 & 容斥)
As everyone known, The Monkey King is Son Goku. He and his offspring live in Mountain of Flowers and ...
- 数据结构(左偏树):HDU 1512 Monkey King
Monkey King Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- ZOJ 2334 Monkey King
并查集+左偏树.....合并的时候用左偏树,合并结束后吧父结点全部定成树的根节点,保证任意两个猴子都可以通过Find找到最厉害的猴子 Monkey King ...
- P1456 Monkey King
题目地址:P1456 Monkey King 一道挺模板的左偏树题 不会左偏树?看论文打模板,完了之后再回来吧 然后你发现看完论文打完模板之后就可以A掉这道题不用回来了 细节见代码 #include ...
- Monkey King(左偏树 可并堆)
我们知道如果要我们给一个序列排序,按照某种大小顺序关系,我们很容易想到优先队列,的确很方便,但是优先队列也有解决不了的问题,当题目要求你把两个优先队列合并的时候,这就实现不了了 优先队列只有插入 删除 ...
- 1512 Monkey King
Monkey King Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- The Monkey King(hdu5201)
The Monkey King Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- hdu 1512 Monkey King 左偏树
题目链接:HDU - 1512 Once in a forest, there lived N aggressive monkeys. At the beginning, they each does ...
随机推荐
- 计算机网络(十),HTTP的关键问题
目录 1.在浏览器地址栏键入URL,按下回车之后经历的流程 2.HTTP状态码 3.GET请求和POST请求的区别 4.Cookie和Session的区别 5.IPV4和IPV6 十.HTTP的关键问 ...
- web前端:上传文件夹(需支持多浏览器)
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- Angular 文档中的修改链接是从哪里改的
如何修改修改的文本的链接. 如下图表示的,如何修改这个地方的链接到自己的 SCM 中. 你需要修改的文件为: aio\tools\transforms\templates\lib\githubLink ...
- Mybatis 结果映射下划线转驼峰
mybatis 结果映射下划线转驼峰 Spring Boot 配置: #下划线转驼峰 mybatis.configuration.map-underscore-to-camel-case=true m ...
- unittest详解(三) 测试套件(TestSuite)
在前面一章中示例了如何编写一个简单的测试,但有两个问题: 我们知道测试用例的执行顺序是根据测试用例名称顺序执行的,在不改变用例名称的情况下,我们怎么来控制用例执行的顺序呢? 一个测试文件,我们直接执行 ...
- DVWA--CRSF
首先我们对CRSF进行一个介绍 CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie.会话等),诱骗其点击恶 ...
- auth 认证组件的补充
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...
- windows 简单实用Elasticsearch
官网下载地址:https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/zip/e ...
- 套接字选项 之 SO_REUSEADDR && SO_REUSEPORT
说明 本文下面内容基本上是截取自stackoverflow,针对这两个选项,在另外一篇文章中做了总结,请移步<Linux TCP套接字选项 之 SO_REUSEADDR && S ...
- 后盾网lavarel视频项目---Laravel 安装代码智能提示扩展「laravel-ide-helper」
后盾网lavarel视频项目---Laravel 安装代码智能提示扩展「laravel-ide-helper」 一.总结 一句话总结: laravel-ide-helper作用是:代码提示 larav ...