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",n);
36         else if(n<n0)printf("0\n");
37         else printf("%lld\n",(((n*C(n-m*k-1,n-m*k-m))%P)*inv[m])%P);
38     }
39 }
View Code

 

posted @ 2016-09-18 21:06  bin_gege  阅读(227)  评论(0编辑  收藏  举报