zoukankan      html  css  js  c++  java
  • HDU 5894 hannnnah_j’s Biological Test【组合数学】

    题目链接:

    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;
    }
  • 相关阅读:
    System.Web.Security下提供了非常简单的MD5加密算法,但处在非Web层的项目要怎么使用MD5加密呢?
    切换用户账户访问共享 记
    从盛大通行证上摘下来的身份证验证代码
    HA_Xenu1.3.6 使用手记
    asp.net跨域共享session(不能跨主机名)
    应用程序池自动关闭
    忘记 win2003 密码 记
    Ajax 入门 【学习手记】
    转载 防盗链
    超链接的 target
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12256241.html
Copyright © 2011-2022 走看看