题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5894

题意:

一个圆桌上有$n$个不同的位置,$m$个相同的人安排到这$n$个位置上,要求两人相邻的人至少相距$k$个位置,问有多少种安排方法?

分析:

我们可以将$1个人的位置和他旁边的k个位置绑定$看成一个盒子,剩下的$n-mtimes (k+1)$个空位置看成若干相同的球,那么这些空位置的插入问题就可以转化为将 $a个相同的球放入b个不同的盒子中$,此时$a=n - m times (k+1),b = m-1$。
利用插板法,想象$a$个球排成一排,中间有$a-1$个空位,取$b-1$个板子,插入到这些空中,由于板子不能插入到同一个地方,则此时没有空盒,与题意不符,那么就先给每个盒子放一个球,求出此时的插板方法数,为${a + b-1 choose {b-1}}$,即${n - m times k - 1 choose {m-1}}$。
位置不同,第一个盒子的位置有$n$种,最后要乘上$n$。人是相同的,最后要除以$m$。
注意判断$n-mtimes k - 1$是否大0,还一定要先特判$m=1$的情况,此时答案为$n$【在这个地方$wa$了无数次。
$m,n$都不是很大,直接打表预处理一下阶乘直接求组合数即可。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
大专栏  HDU 5894 hannnnah_j’s Biological Test【组合数学】 class="meta">#include<map>
#include<algorithm>
using namespace std;
const int maxn = 1e6 + 5, mod = 1e9 + 7;
typedef long long ll;
ll fact[maxn];
void ()
{
fact[0] = 1;
for(int i = 1; i < maxn; i++) fact[i] = fact[i - 1] * 1ll * i % mod;
}
ll quick_pow(ll b, int a)
{
ll ans = 1;
for(; a; a >>= 1, b = b * b % mod){
if(a & 1) ans = ans * b % mod;
}
return ans;
}
int main (void)
{
init();
int T;scanf("%d",&T);
while(T--){
ll m, n, k;scanf("%I64d%I64d%I64d", &n, &m, &k);
if(m == 1){
printf("%I64dn", n);
continue;
}
if(n - 1 < m * k){
puts("0");
continue;
}
ll nn = n - m * k - 1;
ll nm = m - 1;
ll ans = fact[nn] * quick_pow(fact[nm], mod - 2) % mod * quick_pow(fact[nn - nm], mod - 2) % mod;
ans = ans * n % mod * quick_pow(m, mod - 2) % mod;
printf("%I64dn", ans);
}
return 0;
}

HDU 5894 hannnnah_j’s Biological Test【组合数学】的更多相关文章

  1. hdu 5894 hannnnah_j’s Biological Test 组合数学

    传送门:hdu 5894 hannnnah_j’s Biological Test 题目大意:n个座位,m个学生,使每个学生的间隔至少为k个座位 组合中的插空法 思路:每个学生先去掉k个空位间隔,剩下 ...

  2. HDU 5894 hannnnah_j’s Biological Test (组合数学) -2016 ICPC沈阳赛区网络赛

    题目链接 #include <map> #include <queue> #include <math.h> #include <stdio.h> #i ...

  3. HDU 5894 hannnnah_j’s Biological Test

    题目链接:传送门 题目大意:有n张板凳围成一圈,有m个人,要让m个人都坐到凳子上且任意两人之间相隔>=k 个凳子,问有多少种方法%(1e9+7) 题目思路:组合数学 我们这样考虑,既然每个人相距 ...

  4. HDU 5894 hannnnah_j’s Biological Test ——(组合数)

    思路来自于:http://blog.csdn.net/lzedo/article/details/52585170. 不过并不需要卢卡斯定理,直接组合数就可以了. 代码如下: #include < ...

  5. hdu 5894(组合数取模)

    hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K ...

  6. 2016 ACM/ICPC Asia Regional Shenyang Online 1003/HDU 5894 数学/组合数/逆元

    hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K ...

  7. 排列组合+组合数取模 HDU 5894

    // 排列组合+组合数取模 HDU 5894 // 题意:n个座位不同,m个人去坐(人是一样的),每个人之间至少相隔k个座位问方案数 // 思路: // 定好m个人 相邻人之间k个座位 剩下就剩n-( ...

  8. HDU 5059 Harry And Biological Teacher

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5069 题意:给出n个串,m个询问,每个询问(u,v),求u的一个最长后缀是v的前缀. 思路:离线.将关于u ...

  9. HDU 5226 Tom and matrix(组合数学+Lucas定理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5226 题意:给一个矩阵a,a[i][j] = C(i,j)(i>=j) or 0(i < ...

随机推荐

  1. DevComponents.DotNetBar2.dll设置样式的使用

    有点模仿QQ消息盒子的感觉,代码如下: using System; using System.Collections.Generic; using System.ComponentModel; usi ...

  2. UG NX7.5 采用VS2008调试方法

    1.安装NX7.5(x64),这是废话 2.安装visual studio 2008,推荐安装2008,如果是2010应该也可以用,(没有测试,不清楚) 3.复制 UGS\NX 7.5\UGOPEN\ ...

  3. 17.3.13---socket网络套接字介绍--函数和数据类型

    1----Socket类型 套接字格式:socket(family,type[,protocal])使用给定的地址族,套接字类型,协议编号(默认为0)来创建套接字 socket类型 描述 socket ...

  4. CodeForces - 977E

    题:https://codeforces.com/problemset/problem/977/E 题意:给你一个图,问你有几个没有杂边的单环(度全为2) 分析:单环点的度数一定是2,连续边,判断是否 ...

  5. Pwn-Gcc编译命令

  6. 2019-2020-1 20199324《Linux内核原理与分析》第一周作业

    1.问题:使用banner输出图形字符为什么都是大写? 2.实验二:基本概念及操作 作业:命令toilet和figlet的使用 使用如下命令安装 $ sudo apt-get update $ sud ...

  7. 吴裕雄--天生自然C语言开发:数组

    ] = {1000.0, 2.0, 3.4, 7.0, 50.0}; ]; #include <stdio.h> int main () { ]; /* n 是一个包含 10 个整数的数组 ...

  8. mysql之左连接、右连接、内连接、全连接、等值连接、交叉连接等

    mysql中的各种jion的记录,以备用时查 1.等值连接和内连接, a.内连接与等值连接效果是相同的,执行效率也相同,只是书写方式不一样,内连接是由SQL 1999规则定的书写方式 比如: sele ...

  9. VB6实现Excel多工作簿数据合并

    以前的同事,工作需要,让我帮忙完成多个工作簿的汇总. 我就用最熟悉的VB6写了一个Form应用程序,这是因为我不知道她目前的系统和Office情况,如果太高大上了,她不会部署安装.索性就简单粗暴地来个 ...

  10. nginx+php+扩展件安装实践版

    一.安装各种软件包 yum -y install wget git vim lrzsz unzip zip gcc make gd-devel bzip2 bzip2-devel libcurl li ...