【codeforces 768F】 Barrels and boxes

http://codeforces.com/problemset/problem/768/F (题目链接)

题意

  A,B两种物品可以装到栈中,每个栈只能存放一种物品,容量没有限制。现在讲所有栈排成一列,AB相间,问存B的栈长大于H的概率。

Solution

  震惊!F竟是个大水题。。。枚举长度隔板法搞一搞就好了。。

细节

  注意判0分成0组的情况?LL

代码

// codeforces768F
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define MOD 1000000007
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

const int maxn=100010;
LL fac[maxn],ifac[maxn];
int F,W,H,n;
LL P,Q;

LL C(LL n,LL m) {
	if (n==m && n==-1) return 1;
	return n<0||m<0||n<m ? 0 : fac[n]*ifac[m]%MOD*ifac[n-m]%MOD;
}
LL power(LL a,LL b) {
	LL res=1;
	while (b) {
		if (b&1) (res*=a)%=MOD;
		b>>=1;(a*=a)%=MOD;
	}
	return res;
}
int main() {
	scanf("%d%d%d",&F,&W,&H);
	n=F+W;
	fac[0]=1;for (int i=1;i<=100000;i++) fac[i]=fac[i-1]*i%MOD;
	ifac[100000]=power(fac[100000],MOD-2);
	for (int i=100000;i;i--) ifac[i-1]=ifac[i]*i%MOD;
	for (int i=1;i<=n;i++) {
		int w=(i&1) ? 1 : 2;
		for (int j=i>>1;j<=(i+1)>>1;j++) {
			LL q=C(F-1,j-1)*C(W-1,i-j-1)%MOD*w%MOD;
			LL p=C(F-1,j-1)*C(W-1LL*(i-j)*H-1,i-j-1)%MOD*w%MOD;
			(Q+=q)%=MOD,(P+=p)%=MOD;
		}
	}
	printf("%lld",P*power(Q,MOD-2)%MOD);
	return 0;
}

  

posted @ 2017-03-15 14:07  MashiroSky  阅读(...)  评论(... 编辑 收藏