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 }