题意: m个人要考试,老师将他们安排在一张有n把椅子的圆桌上,任意两人之间至少隔着k把椅子,问方案数 %(1e9+7) .
思路:
1.
保证n>=m∗(k+1)
.
2.固定第一个人的位置,这样固定的方法就有
n
种,先在两人之间放k把椅子,那么剩下
n−m∗(k+1)
把椅子.
3.剩下的椅子要放在任意两人之间,这样就是一个经典模型:小球不区分,盒子区分,盒子可为空.即
(m−1n−m⋅k−1)
4.固定第一人的方法有
n
种,并且每个位置轮流会有重复,所以需要除以
m
.最终答案即是
n⋅(m−1n−m⋅k−1)mmod(1e9+7)
5. 显然这是个大组合数,Lucas定理套一下,
注意:需要特判 m==1 的情况,即使一个人,可在 n 位置上任意选,答案即为 n
.
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MOD=1e9+7;
LL Quick_Pow(LL a,LL b){
//printf("a=%db=%dc=%d\n",a,b,c);
LL ans=1;
while (b){
if (b&1)ans=(ans*a)%MOD;
a=(a*a)%MOD;
b>>=1;
}
return ans;
}
LL C(LL n,LL m){
LL ans=1;
if (n<m)return 0;
for (LL i=1; i<=m; ++i)
ans=ans*(((n-m+i)*Quick_Pow(i,MOD-2))%MOD)%MOD; //注意*和%的优先级.
return ans;
}
LL Lucas(LL n,LL m){
if (!m)return 1;
else return Lucas(n/MOD,m/MOD)*C(n%MOD,m%MOD)%MOD;
}
int main(){
LL n,m,k;
int t;
scanf("%d",&t);
while (t--){
scanf("%lld%lld%lld",&n,&m,&k);
if (m==1)printf("%lld\n",n);
else
printf("%lld\n",((n*C(n-1-k*m,m-1)%MOD)*Quick_Pow(m,MOD-2))%MOD);
}
}