CF 16E Fish

Idea

对于\(n\)条鱼,它们两两不相遇的方案数为\(\frac{n(n-1)}{2}\)
对于鱼\(i\)吃掉鱼\(j\),要经过以下三个事件

  1. \(i\),鱼\(j\)都在湖里;记为事件\(A\)
  2. \(i\),鱼\(j\)相遇;记为事件\(B\)
  3. \(i\)吃掉鱼\(j\);记为事件\(C\)

所以\(P(\text{i吃j})=P(A)+P(B)+P(C)\)
\(f[x]\)为湖中鱼状态为\(x\)的状态,则

\[f[x\ Xor \ (1<<j)]+=f[x]\times \frac{2a[i][j]}{n(n-1)},i,j\in x; \]

\(n\)\((x)_2\) 下1的个数

Code

double f[1<<20]; 
double a[20][20];
int n,cnt;
inline int cal(int x){
	int cnt=0;
	while(x){
		cnt++;
		x^=x&(-x); 
	}
	return cnt;
}
signed main(){
	n=read();
	for(int i=0;i<n;i++)
	for(int j=0;j<n;j++)
	scanf("%lf",&a[i][j]);
	f[(1<<n)-1]=1;
	for(int k=(1<<n)-1;k>0;k--)
	if(f[k])
	for(int i=0;i<n;i++)
	if((1<<i)&k)
	for(int j=0;j<n;j++)
	if(i!=j&&(1<<j)&k){
		cnt=cal(k);
		if(cnt>1) f[k^(1<<j)]+=f[k]*2*a[i][j]/cnt/(cnt-1);
	}
	for(int i=0;i<n;i++)
	printf("%.6lf ",f[1<<i]);
	return 0;
} 
 
posted @ 2019-09-10 17:02  云山乱  阅读(176)  评论(0编辑  收藏  举报