zoukankan      html  css  js  c++  java
  • 【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;
    }
    

      

  • 相关阅读:
    jdk1.8StreamApi
    Python 【类的创建和类的实例化】
    Python【网络编程】
    Python 【图片转字符画】
    echarts 【图表的基本使用】
    Java 【Math】
    Java 【循环语句】
    Java 【instanceof使用】
    java【第三课 条件语句】
    Java【第二课 扫描仪 & 布尔数据类型】
  • 原文地址:https://www.cnblogs.com/MashiroSky/p/6553934.html
Copyright © 2011-2022 走看看