CF457D Bingo! 概率,期望复习

好久没做概率题了

基本上自己想不出来每次都得看题解学

这道题基本上没人写 题解 ,我来占个沙发

\(Firstly\),思路

\(2019.10.26\)

补充 :

你的最终得分为\(2^t\) 求得分的期望

对于\(2^t\) 我们可以理解为有一个集合\(A ,S.T.|A|=t \Rightarrow\) \(A\)\(2^t\)个子集

期望

\[ans=\displaystyle\sum^{n}_{r=0}\sum^{n}_{c=0}C_{n}^{r}*C_{n}^{c}*p_{r,c} \]

重点算\(p_{r,c}\)

\(m\)中选出\(k\)个数分布在选中的\(r\)\(c\)

\(r\)\(c\)列 共有 \(num=(r+c)*n-r*c\)

\(num\)个数已经选出来且分布在选中的\(r\)\(c\)

剩下\(C_{m-num}^{k-num}\)选数方式

\[p_{r,c}=\frac{C_{m-num}^{k-num}}{C_{m}^{k}} \]

\(2019.10.26\)

补充:这里会与\(P_{R,C}(R>=r,C>=c)\)算重 但这样反而是正确的

针对每一个\(t\) 我们都算了她的子集 所以 是\(2^t\)

这句话感性理解下就好我也不是很懂 欢迎懂的人跟我讲

关键是此题数据很大 又没有说取模

那么可以想到用指数进行运算

应该知道

\[log(n)=log_{e}n \]

\[exp(x)=e^x \]

\(Attention\)

\(long double\)

输出 转成\(double\) 再用\(lf\) 输出

\(Lf\)输出\(long double\)本地可过 \(CF\)上会错 (雾)

\(vjudge\) 上语言选 GNU \(G++11 5.1.0\)

\(Code\)

#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
#define reg register int
#define isdigit(x) ('0' <= (x)&&(x) <= '9')
template<typename T>
inline T Read(T Type)
{
	T x = 0,f = 1;
	char a = getchar();
	while(!isdigit(a)) {if(a == '-') f = -1;a = getchar();}
	while(isdigit(a)) {x = (x << 1) + (x << 3) + (a ^ '0');a = getchar();}
	return x * f;
}
typedef long double lb;
const int MAXN = 100010;
lb f[MAXN],ans;
inline lb C(int n,int m)
{
	return f[n] - f[m] - f[n - m];
}
int main()
{
	int n = Read(1),m = Read(1),k = Read(1);
	for(reg i = 1;i <= 1e5;i++) f[i] = f[i - 1] + log(1.0 * i);
	for(reg i = 0;i <= n;i++)
	{
		for(reg j = 0;j <= n;j++)
		{
			int num = (i + j) * n - i * j;
			if(num <= k)
			{
				lb p = C(n,i) + C(n,j) + C(m - num,k - num) - C(m,k);
				ans = min(ans + exp(p),(lb)1e99);
			}
		}
	}
	printf("%.10lf",(double)ans);
    return 0;
}
posted @ 2019-10-23 14:02  resftlmuttmotw  阅读(312)  评论(0编辑  收藏  举报