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

题目

学校的运动会开始了,体能很菜的小可可没报任何比赛项目,于是和同学们玩一个十分无聊的游戏。
游戏在一个由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=0CrnCcnpr,c

其中 pR,C=CktmtCkm t为涂全黑R行,C列总共涂黑的格子,即 t=n(r+c)rc
用一个简单的DP做就OK了。
注意事项:
由于DP式中的C下面的数都是n,所以我们设 C[i] 表示 Cin ,因为 Ci1n=(ni+1+1)...n(ni+1)! 所以, Cin=Ci1nni+1i
因为 pR,C=CktmtCkm ,k和m不变,变的只有t,所以考虑一下怎么将 Ck(t1)m(t1)Ckm 转移到 CktmtCkm
CktmtCkm=(mt)!(mk)!k!(mk)!(kt)!m!=(mt)!k!(kt)!m!Ck(t1)m(t1)Ckm=(mt+1)!k!(kt+1)!m!

CktmtCkmCk(t1)m(t1)Ckm=kt+1mt+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[N],C[N],Q[N],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);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值