2016 ACM/ICPC Asia Regional Shenyang Online hannnnah_j’s Biological Test【组合数学】

来源:互联网 发布:镇江学美工设计 编辑:程序博客网 时间:2024/05/02 02:04

Hdu 5894

题意:圆桌周围有n个座位,给m个人安排座位,要求任意两个人之间至少隔k个空座位。

分析:我们先让第一个人选一个座位,隔k个空位可以看作每个人与k个位置绑在一起,从剩下的n-1个位置里抽出符合要求的k*m个位置,剩下的m-1个人就从n-1-m*k个位置里选,因为第一个人有n个位置可选,所以乘以n,m个人的位置无差别,旋转同构,重复计算m-1次,除以m.

#include<iostream>#include<cstdio>#include<iomanip>#include<cstdlib>#include<cstring>#include<algorithm>#include<math.h>#include<ctype.h>#include<time.h>#include<stack>#include<queue>#include<bitset>#include<set>#include<map>#include<vector>#include<sstream>using namespace std;typedef long long ll;void fre(){freopen("in.txt","r",stdin);}#define MS(x,y) memset(x,y,sizeof(x))#define MC(x,y) memcpy(x,y,sizeof(x))#define zero(a) fabs(a)<eps#define equal(a,b) zero(a-b)const int pi=acos(-1);double e=2.718281828;const int mod=1e9+7;ll qmod(ll x,int n){    ll ans=1;    while(n)    {        if(n&1)            ans=ans*x%mod;        x=x*x%mod;        n>>=1;    }    return ans;}ll C(int n,int m){    if(m>n)        return 0;    ll ans=1;    for(int i=1;i<=m;i++)        ans=ans*((n+i-m)*qmod(i,mod-2)%mod)%mod;    return ans;}int main(){//    fre();    int t;    scanf("%d",&t);    ll n,m,k;    while(t--)    {        scanf("%lld%lld%lld",&n,&m,&k);        if(m==1)            printf("%lld\n",n);        else            printf("%lld\n",(C(n-k*m-1,m-1)*n%mod)*qmod(m,mod-2)%mod);    }    return 0;}

要是当时。。。说到底还是菜,菜是原罪,难得碰上数论还是没做出来,本来碰上数论专场是个大惊喜,到头一道题也没出,嗨,还是要薛习一个,提高自己的姿势水平。

“`

1 0
原创粉丝点击