您的位置:首页 > 其它

JZOJ 3871. 【NOIP2014八校联考第4场第1试10.19】无聊的游戏(game)

2017-01-18 07:47 387 查看

题目

学校的运动会开始了,体能很菜的小可可没报任何比赛项目,于是和同学们玩一个十分无聊的游戏。

游戏在一个由n*n个方格组成的正方形棋盘上进行,首先在每个方格上均匀随机地填入1到m之间的正整数(每个方格填的数均不同),然后小可可均匀随机地选出k个1到m的数字(可能选的数不在棋盘上),把它们出现在棋盘上的方格涂黑,设有R行被整行涂黑,有C列被整列涂黑,小可可便可以得到2^(R+C)分。

现在小可可想知道他的期望得分是多少,你能帮助他吗?

样例输入

1 2 1

样例输出

4.5

样例解释

在1*1的方格中填入1,选1或2,得分分别为2^2=4和2^0=1;在1*1的方格中填入2,选1或2,得分分别为2^0=1和2^2=4,所以期望得分为(4+1+1+4)/4=2.5。

数据范围

对于100%的数据,2≤n≤300, n*n≤m≤100000, n≤k≤m。

题解

给定一个全涂黑的行集合R和列集合C,设这些行和列被涂黑的概率为pr,c,那么ans显然等于ΣR,Cpr,c。再设r=|R|,c=|C|,(|a|为集合a元素的个数)

∵ R,C 集合大小相同的 pR,C 也相同

所以ans=Σnr=0Σnc=0CrnCcn∗pr,c

其中pR,C=Ck−tm−tCkmt为涂全黑R行,C列总共涂黑的格子,即t=n(r+c)−rc。

用一个简单的DP做就OK了。

注意事项:

由于DP式中的C下面的数都是n,所以我们设C[i]表示Cin,因为Ci−1n=(n−i+1+1)∗...∗n(n−i+1)!所以,Cin=Ci−1n∗n−i+1i。

因为pR,C=Ck−tm−tCkm,k和m不变,变的只有t,所以考虑一下怎么将Ck−(t−1)m−(t−1)Ckm转移到Ck−tm−tCkm。

∵Ck−tm−tCkm=(m−t)!(m−k)!k!(m−k)!(k−t)!m!=(m−t)!k!(k−t)!m!,Ck−(t−1)m−(t−1)Ckm=(m−t+1)!k!(k−t+1)!m!

∴Ck−tm−tCkmCk−(t−1)m−(t−1)Ckm=k−t+1m−t+1

然后去递推就行了。

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#define N 100003
#define DB long double
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
int n,m,k,i,r,c,t;
DB jc
,C
,Q
,ans;
int main()
{
scanf("%d%d%d",&n,&m,&k);
C[0]=Q[0]=1;
fo(i,1,n) C[i]=C[i-1]*((DB)(n-i+1)/i);
fo(i,1,k) Q[i]=Q[i-1]*((DB)(k-i+1)/(m-i+1));
fo(r,0,n)
fo(c,0,n)
{
t=n*(r+c)-r*c;
if (t<=k) ans=ans+Q[t]*C[r]*C[c];
}
if (ans>1e+99) ans=1e+99;
printf("%LF",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐