zoukankan      html  css  js  c++  java
  • hdu_5894_hannnnah_j’s Biological Test(打表找规律)

    题目链接:hdu_5894_hannnnah_j’s Biological Test

    题意:

    有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排

    题解:

    先打表找规律,最后发现答案为n*C(n-m*k-1,n-m*k-m)/m

    然后这里求组合要预处理一下,逆元也预处理一下

    最后还要特判m为1的情况

     1 #include<cstdio>
     2 typedef long long ll;
     3 const int P=1e9+7;
     4 
     5 const int maxn=1e6+3;
     6 long long inv[maxn]={0,1},a[maxn],b[maxn];
     7 
     8 ll pow_mod(ll a, ll b)
     9 {
    10     ll ans = 1;
    11     while (b)
    12     {
    13         if (b & 1)ans = (ans*a) % P;
    14         b >>= 1, a = (a*a) % P;
    15     }
    16     return ans;
    17 }
    18 
    19 ll C(ll x,ll y)
    20 {
    21     return b[x]*a[y]%P*a[x-y]%P;
    22 }
    23 
    24 int main(){
    25     int t;ll n,m,k;
    26     b[1]=1;
    27     for(int i=2;i<maxn;i++)b[i]=b[i-1]*i%P;
    28     for(int i=1;i<maxn;i++)a[i]=pow_mod(b[i],P-2);
    29     for(int i=2;i<maxn;i++)inv[i]=inv[P%i]*(P-P/i)%P;
    30     scanf("%d",&t);
    31     while(t--)
    32     {
    33         scanf("%lld%lld%lld",&n,&m,&k);
    34         ll n0=m*(k+1);
    35         if(m==1)printf("%lld
    ",n);
    36         else if(n<n0)printf("0
    ");
    37         else printf("%lld
    ",(((n*C(n-m*k-1,n-m*k-m))%P)*inv[m])%P);
    38     }
    39 }
    View Code
  • 相关阅读:
    2019.8.16
    一种抠环的办法
    [HAOI2015]树上染色
    有关树形背包
    2019.7.27
    有关矩阵快速幂
    2019.7.25
    欧拉函数(转载)
    2019.7.22
    phpstudy集成环境安装redis扩展
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5883039.html
Copyright © 2011-2022 走看看