其他分享
首页 > 其他分享> > CF398B口胡

CF398B口胡

作者:互联网

每次操作等价于随机选择一行和一列然后染色,询问所有行列都被染色操作的期望。

于是就很显然了,\(dp[n][m]\) 表示已经有 \(n\) 行 \(m\) 列被染色的期望。

显然有:

\[dp[n][m]=dp[n][m]\times\frac{n}{N}\times\frac{m}{N}+dp[n+1][m]\times\frac{N-n}{N}\times\frac{m}{N}+dp[n][m+1]\times\frac{n}{N}\times\frac{N-m}{N}+dp[n+1][m+1]\times\frac{N-n}{N}\times\frac{N-m}{N}+1 \]

答案是 \(dp[x][y]\),其中 \(x,y\) 是初始被染色的格子数量。

#include<cstdio>
#include<cctype>
typedef double db;
const int M=2005;
int n,m,x,y;db inv,dp[M][M];bool visx[M],visy[M];
inline int read(){
	int n(0);char s;while(!isdigit(s=getchar()));while(n=n*10+(s&15),isdigit(s=getchar()));return n;
}
signed main(){
	n=read();m=read();inv=1./n/n;for(int x,y,i=1;i<=m;++i)visx[read()]=true,visy[read()]=true;
	for(int i=1;i<=n;++i)x+=visx[i],y+=visy[i];
	for(int i=n;i>=0;--i)for(int j=n;j>=0;--j)if(!(i==n&&j==n)){
		if(i!=n)dp[i][j]+=dp[i+1][j]*(n-i)*j*inv;
		if(j!=n)dp[i][j]+=dp[i][j+1]*i*(n-j)*inv;
		if(i!=n&&j!=n)dp[i][j]+=dp[i+1][j+1]*(n-i)*(n-j)*inv;
		dp[i][j]+=1;dp[i][j]/=1-i*j*inv;
	}
	printf("%.10lf",dp[x][y]);
}

标签:frac,int,inv,times,read,CF398B,dp
来源: https://www.cnblogs.com/lmpp/p/16534369.html