The Monkey King

Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 487    Accepted Submission(s): 166

Problem Description
As
everyone known, The Monkey King is Son Goku. He and his offspring live
in Mountain of Flowers and Fruits. One day, his sons get n peaches. And there are m monkeys (including GoKu), they are numbered from 1 to m,
GoKu’s number is 1. GoKu wants to distribute these peaches to
themselves. Since GoKu is the King, so he must get the most peach. GoKu
wants to know how many different ways he can distribute these peaches.
For example n=2, m=3, there is only one way to distribute these peach: 2
0 0.

When given n and m,
you are expected to calculate how many different ways GoKu can
distribute these peaches. Answer may be very large, output the answer
modular 1000000007 instead.
 
Input
There are multiple test cases. In the first line of the input file there is an integer T indicates the number of test cases.

In the next T lines, each line contains n and m which is mentioned above.

[Technical Specification]

All input items are integers.

1≤T≤25

1≤n,m≤100000
 
Output
For each case,the output should occupies exactly one line.

See the sample for more details.
 
Sample Input
2
2 2
3 5
Sample Output
1
5

Hint

For the second case, there are five ways. They are
2 1 0 0 0
2 0 1 0 0
2 0 0 1 0
2 0 0 0 1
3 0 0 0 0

 
思路:隔板法+容斥+逆元;
先枚举第一个人分得的个数,然后我们考虑剩下的可以咋放,剩下的为n-i那么这些要给m-1个人,且可以为空,那么就是C(n-i+m-2,m-2)种,然后我们减去里面不符合情况的,我们枚举至少有k个不小于第一个人的个数的,那么我们就必须在这些人中给i个,然后剩下的在用分给m-1个人,F[j] = C(m-1,1)*C(n-(1+k)*j+m-2,m-2)
那么这些里面会有重复的,F[1] = C(1,1)f(1)+C(2,1)f(2)+C(3,1)f(3)+......;
F[2] = C(2,2)f(2) + C(3,2)f(3)+C(4,2)f(4)+....;
那么f(j)就是我们要的,那么我们可以知道F(1)-F(2) + F(3)-F(4).....  = f(1)+f(2)+...;
(1+x)^n+(1-x)^n = 2*(C(n,0)+C(n,2)+...)当x = 1的时候那么有偶数项等于2^(n-1) = 奇数项,那么C(n,1)-C(n,2)+C(n,3) ..+C(n,n) = 1;
所以要的到sum(f(j)) = F(1)-F(2) + F(3)-F(4)..... (奇加偶减)
复杂度(n*log(n))
 1 #include <iostream>
2 #include<algorithm>
3 #include<string.h>
4 #include<queue>
5 #include<math.h>
6 #include<set>
7 #include<stdio.h>
8 using namespace std;
9 typedef long long LL;
10 LL N[200010];
11 LL NN[200010];
12 const LL mod = 1e9+7;
13 LL quick(LL n,LL m);
14 LL C(LL n,LL m);
15 int main(void)
16 {
17 int n;
18 scanf("%d",&n);
19 N[0] = 1;
20 int i,j;NN[0] = 1;
21 for(i = 1; i <= 200005; i++)
22 {
23 N[i] = N[i-1]*(LL)i%mod;
24 NN[i] = quick(N[i],mod-2);
25 }
26 //printf("%lld\n",quick(6,mod-2));
27 while(n--)
28 {
29 int m,k;
30 scanf("%d %d",&m,&k);
31 LL sum = 0;
32 if(k == 1)
33 printf("%d\n",k);
34 else
35 {
36 for(i = m; i >= 1; i--)
37 {
38 LL x = m-i;
39 LL y = k-1;
40 LL an = C(x+y-1,y-1);
41 for(j = 1; j <= k-1&&(LL)(j+1)*(LL)i<= m; j++)
42 {
43 x = k-1;
44 y = j;
45 LL akk = C(x,y);
46 LL ab = m-(LL)(j+1)*(LL)i;
47 ab = ab+k-2;
48 LL bk = C(ab,k-2);
49 if(j%2)
50 an = an-bk*akk%mod;
51 else an+=(bk*akk)%mod;
52 an = an%mod;
53 }
54 sum = (sum+an)%mod;
55 }
56 printf("%lld\n",(sum%mod+mod)%mod);
57 }
58 }
59 }
60 LL C(LL n,LL m)
61 {
62 LL ni = NN[n-m]*NN[m]%mod;
63 return ni*N[n]%mod;
64 }
65 LL quick(LL n,LL m)
66 {
67 LL ask = 1;
68 n%=mod;
69 while(m)
70 {
71 if(m&1)
72 ask = ask*n%mod;
73 n = n*n%mod;
74 m/=2;
75 }
76 return ask;
77 }

The Monkey King(hdu5201)的更多相关文章

  1. ZOJ 2334 Monkey King

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

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

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

  3. P1456 Monkey King

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

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

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

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

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

  6. 1512 Monkey King

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

  7. HDU-5201 The Monkey King

    题目描述 \(m\)个猴子分\(n\)个桃,要求第一个猴子的桃数严格大于其他猴子,问有多少种分法对\(1e9+7取模(\%1e9+7)\) Input \(1≤T≤25 ,1≤n,m≤100000\) ...

  8. hdu1512 Monkey King

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

  9. [Monkey King]

    题目描述 在一个森林里住着N(N<=10000)只猴子.在一开始,他们是互不认识的.但是随着时间的推移,猴子们少不了争斗,但那只会发生在互不认识(认识具有传递性)的两只猴子之间.争斗时,两只猴子 ...

随机推荐

  1. 7本Python必读的入门书籍,你看过吗?(附福利)

    Python入门书籍不用看太多,看一本就够.重要的是你要学习Python的哪个方向,或者说你对什么方向感兴趣,因为Python这门语言的应用领域比较广泛,比如说可以用来做数据分析.机器学习,也可以用来 ...

  2. GISer如何突破二次开发瓶颈

    年初时写的<一个GISer的使命>那篇文章中,提出了GISer的技术提升路径可以分为四个大的阶段: 阶段一,能使用商业GIS软件去解决问题. 阶段二,能使用开源GIS软件去解决问题. 阶段 ...

  3. hadoop运行jar包报错

    执行命令:[root@hadoop102 mapreduce]# hadoop jar mapreduce2_maven.jar Filter 错误信息:Exception in thread &qu ...

  4. 学习java的第六天

    一.今日收获 1.开始了学习手册第二章的学习 2.了解了java里的常量与变量以及数据类型,与c语言的内容类似 二.今日难题 1.都是基础知识,没有什么难题 三.明日目标 1.继续学习java学习手册 ...

  5. 学习java第十九天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  6. Shell学习(六)——条件判断总结

    Shell学习(六)--条件判断总结 [1]https://www.cnblogs.com/zhw-626/p/8528001.html [2]https://www.cnblogs.com/yizh ...

  7. Android: EditText设置属性和设置输入规则

    1.EditText输入限制规则 在xml:EditText 设置属性 android:digits="ABCDE123&*" ABCDE123&*是你的限制规则 ...

  8. 多线程异步操作导致异步线程获取不到主线程的request信息

    org.springframework.web.context.request.RequestContextHolderorg.springframework.web.context.request. ...

  9. 【Java 基础】Java Enum

    概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承jav ...

  10. Jenkins配置java项目

    目录 一.场景介绍 二.项目配置 配置插件 配置项目 一.场景介绍 在部署完Jenkins后,需要将现有的maven项目(Jenkis的开源插件),放到Jenkins上,用于自动化运维的改造. 项目地 ...