HDU 5894 hannnnah_j’s Biological Test

題目連接:傳送門ios

題目大意:有n張板凳圍成一圈,有m我的,要讓m我的都坐到凳子上且任意兩人之間相隔>=k 個凳子,問有多少種方法%(1e9+7)spa

題目思路:組合數學.net

     咱們這樣考慮,既然每一個人相距>=k 個凳子,m我的就至少有m*k個凳子不能坐人,那咱們先從中抽出這m*k個凳子,其它code

     凳子均可以坐了,而後咱們考慮第一我的坐到了一個位置上,剩下的人就有C(n-m*k-1,m-1)種坐法,而第一我的有n種blog

     初始選擇,但因爲m我的又相同,故應該是C(n-m*k-1,m-1)*n/m種坐法。get

     Note:必定要注意%MOD,否則中間會爆long long,我就被坑了40min。。。。。數學

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <cstring>
 7 #include <stack>
 8 #include <cctype>
 9 #include <queue>
10 #include <string>
11 #include <vector>
12 #include <set>
13 #include <map>
14 #include <climits>
15 #define lson rt<<1,l,mid
16 #define rson rt<<1|1,mid+1,r
17 #define fi first
18 #define se second
19 #define ping(x,y) ((x-y)*(x-y))
20 #define mst(x,y) memset(x,y,sizeof(x))
21 #define mcp(x,y) memcpy(x,y,sizeof(y))
22 using namespace std;
23 #define gamma 0.5772156649015328606065120
24 #define MOD 1000000007
25 #define inf 0x3f3f3f3f
26 #define N 1000050
27 #define maxn 3001
28 typedef pair<int,int> PII;
29 typedef long long LL;
30 
31 int n,m,k,x,y,v;
32 LL fac[N];
33 LL ksm(LL a,LL b){
34     LL res=1;
35     while(b){
36         if(b&1)res=res*a%MOD;
37         b>>=1;
38         a=a*a%MOD;
39     }
40     return res;
41 }
42 LL C(LL n,LL m){
43     if(m>n||m<0)return 0;
44     LL s1=fac[n],s2=fac[n-m]*fac[m]%MOD;
45     return s1*ksm(s2,MOD-2)%MOD;
46 }
47 int main(){
48     int i,j,group;
49     fac[0]=1ll;for(i=1;i<N;++i)fac[i]=fac[i-1]*i%MOD;
50     scanf("%d",&group);
51     while(group--){
52         scanf("%d%d%d",&n,&m,&k);
53         if(m==1){printf("%d\n",n);continue;}
54         if(n<m*(k+1)){printf("0\n");continue;}
55         printf("%lld\n",1ll*C(n-m*k-1,m-1)*n%MOD*ksm(m,MOD-2)%MOD);
56     }
57     return 0;
58 }
相關文章
相關標籤/搜索