2019.01.02 poj1322 Chocolate(生成函数+二项式定理)

版权声明:随意转载哦......但还是请注明出处吧: https://blog.csdn.net/dreaming__ldx/article/details/85608257

传送门
生成函数好题。
题意简述:一个袋子里有 c c 种不同颜色的球,现要操作 n n 次,每次等概率地从袋中拿出一个球放在桌上,如果桌上有两个相同的球就立刻消去,问最后桌上剩下 m m 个球的概率。


第一眼反应是概率 d p dp ,怼了一波式子之后发现要 T T 果断弃掉。
我们考虑推答案的式子吧。
由题可知, c c 种球有 m m 个出现奇数次, c m c-m 个出现偶数次。
于是我们对每一种颜色构造生成函数(指数型)
算出来 f ( x ) = C c m ( e x e x 2 ) m ( e x + e x 2 ) c m n c f(x)=\frac{C_c^m(\frac{e^x-e^{-x}}2)^m(\frac{e^x+e^{-x}}2)^{c-m}}{n^c}
然后把分子后面两坨二项式展开。
推出来:
f ( x ) f(x) 的系数 = C c m i = 0 m j = 0 c m ( 1 ) m i C m i C c m j e 2 ( i + j ) c n c = C c m i = 0 m j = 0 c m ( 1 ) m i C m i C c m j ( k c ) n n c =\frac{C_c^m\sum_{i=0}^m\sum_{j=0}^{c-m}(-1)^{m-i}C_m^iC_{c-m}^je^{2(i+j)-c}}{n^c}=\frac{C_c^m\sum_{i=0}^m\sum_{j=0}^{c-m}(-1)^{m-i}C_m^iC_{c-m}^j(\frac kc)^n}{n^c}
注意 p o j poj 这个 O J OJ 上面不能用 l f lf (怒
代码:

#include<iostream>
#include<cstdio>
#define ri register int
using namespace std;
const int K=105;
double C[K][K];
int n,m,c;
inline void init(){
	C[0][0]=1;
	for(ri i=1;i<=100;++i)C[i][i]=C[i][0]=1,C[i][1]=i;
	for(ri i=2;i<=100;++i)for(ri j=2;j<i;++j)C[i][j]=C[i-1][j]+C[i-1][j-1];
}
inline double ksm(double a,int p){double ret=1.0;for(;p;p>>=1,a=a*a)if(p&1)ret=ret*a;return ret;}
int main(){
	init();
	while(scanf("%d",&c),c){
		scanf("%d%d",&n,&m);
		if(((n-m)&1)||m>c||m>n){puts("0.000");continue;}
		double sum=0.0;
		for(ri i=0;i<=m;++i){
			for(ri j=0;j<=c-m;++j){
				double tmp=C[m][i]*C[c-m][j]*ksm((double)(2*(i+j)-c)/(double)c,n);
				if((m-i)&1)sum-=tmp;
				else sum+=tmp;
			}
		}
		printf("%.3f\n",sum/ksm(2.0,c)*C[c][m]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/dreaming__ldx/article/details/85608257