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. Bebug与Release版本

    如果调试过程无调试信息,检查编译选项是否切换到了release下 比如Cfree5等编译器 ms为了方便调试才诞生了DEBUG版. 这也导致了MFC有两个功能一至但版本不同的类库,一个为DEBUG版, ...

  2. CMakeLists.txt添加多个源代码

    coos2d-x 3.17.2 C++工程,安卓编译使用CMake,按照模板给的写法,只能一个一个源文件添加:如果需要添加大量的C++源代码,这种方式肯定不可取:原来的写法: 1 list(APPEN ...

  3. 学习java 7.26

    学习内容: 进度条是图形界面中广浅个较大的文件时,操作系统会显示一个进度条,用于标识复制操作完成的比例:当启动Eclipse等程序时,因为需要加载较多的资源,故而启动速度较慢,程序也会在启动过程中显示 ...

  4. acclaim

    欲学acclaim,先学claim.即使学会claim,未必记住acclaim. [LDOCE] claim的词源是cry out, shoutverb:1. state that sth is tr ...

  5. Hive(十一)【压缩、存储】

    目录 一.Hadoop的压缩配置 1.MR支持的压缩编码 2.压缩参数配置 3.开启Mapper输出阶段压缩 4.开启Reduceer输出阶段 二.文件存储 1.列式存储和行式存储 2.TextFil ...

  6. 转 Android Lifecycle、ViewModel和LiveData

    转自:https://www.jianshu.com/p/982545e01d0a 1.概述 在I / O '17的时候,其中一个重要的主题是Architecture Components.这是一个官 ...

  7. spring boot-jpa整合QueryDSL来简化复杂操作

    spring boot-jpa整合QueryDSL来简化复杂操作 SpringDataJPA+QueryDSL玩转态动条件/投影查询  

  8. GO瞬间并发数控制

    var wg2 sync.WaitGroup wg2.Add(nums) xc :=0 parallelNum := plt.MaxParallel var waitCount int32 = 0 f ...

  9. 一文读懂RESTful架构

    转载自https://zhuanlan.zhihu.com/p/381554129 RESTful架构究竟是什么 别着急,想要了解RESTful,我们先来了解一位大佬Roy Thomas Fieldi ...

  10. springboot中如何向redis缓存中存入数据

    package com.hope;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jack ...