标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 802 Accepted Submission(s): 269
nn
的环,选 mm
个位置涂黑,要求相邻两个黑点之间至少间隔 kk
个白点,问方案数。ans = n * C(n - m*k -1,m - 1)/m;
乘n相当于第一个人有n种选择,而学生在这里都是一样的,所以要是重复计算了m次,最后除以m。
逆元 费马小处理
1 /****************************** 2 code by drizzle 3 blog: www.cnblogs.com/hsd-/ 4 ^ ^ ^ ^ 5 O O 6 ******************************/ 7 #include<bits/stdc++.h> 8 #include<iostream> 9 #include<cstring> 10 #include<cmath> 11 #include<cstdio> 12 #define ll long long 13 #define mod 1000000007 14 #define PI acos(-1.0) 15 #define N 1000000000 16 using namespace std; 17 ll quickmod(ll a,ll b) 18 { 19 ll sum=1; 20 while(b) 21 { 22 if(b&1) 23 sum=(sum*a)%mod; 24 b>>=1; 25 a=(a*a)%mod; 26 } 27 return sum; 28 } 29 ll combine1(ll n,ll m) //计算组合数C(n,m) 30 { 31 if(n<0||m<0) 32 return 0; 33 ll sum=1; //线性计算 34 for(ll i=1,j=n;i<=m;i++,j--) 35 sum=(((sum*j)%mod)*quickmod(i,mod-2))%mod; 36 return sum; 37 } 38 int t; 39 ll nn,mm,kk; 40 int main() 41 { 42 while(scanf("%d",&t)!=EOF) 43 { 44 for(int i=1;i<=t;i++) 45 { 46 scanf("%I64d %I64d %I64d",&nn,&mm,&kk); 47 if(mm==1) 48 printf("%I64d\n",nn); 49 else 50 printf("%I64d\n",(((combine1(nn-mm*kk-1,mm-1)%mod)*quickmod(mm,mod-2))%mod*nn)%mod); 51 } 52 } 53 return 0; 54 }
2016 ACM/ICPC Asia Regional Shenyang Online 1003/HDU 5894 数学/组合数/逆元
标签:
原文地址:http://www.cnblogs.com/hsd-/p/5894308.html