链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2652
题解
每个格子对答案的贡献都是独立的,因此我可以对每个格子的期望都算一遍然后加起来
对于在
(
i
,
j
,
k
)
(i,j,k)
(i,j,k)的格子
它每次被选中的概率都是
p
(
i
,
j
,
k
)
=
(
2
i
(
n
−
i
+
1
)
−
1
)
(
2
j
(
m
−
j
+
1
)
−
1
)
(
2
k
(
q
−
k
+
1
)
−
1
)
(
n
m
q
)
2
p_{(i,j,k)}=\frac{(2i(n-i+1)-1)(2j(m-j+1)-1)(2k(q-k+1)-1)}{(nmq)^2}
p(i,j,k)=(nmq)2(2i(n−i+1)−1)(2j(m−j+1)−1)(2k(q−k+1)−1)
其中
n
,
m
,
q
n,m,q
n,m,q代表长方体的边长
设第
i
i
i次之后开着灯的概率为
a
i
a_i
ai,那么
a
1
=
p
a_1=p
a1=p
a
n
=
(
1
−
p
)
a
n
−
1
+
p
(
1
−
a
n
−
1
)
a_n=(1-p)a_{n-1}+p(1-a_{n-1})
an=(1−p)an−1+p(1−an−1)
求得通项公式
a
n
=
(
p
−
1
2
)
(
1
−
2
p
)
n
−
1
+
1
2
a_n=(p-\frac{1}{2})(1-2p)^{n-1}+\frac{1}{2}
an=(p−21)(1−2p)n−1+21
所以格子
(
i
,
j
,
k
)
(i,j,k)
(i,j,k)对答案的贡献就是
1
×
[
(
p
−
1
2
)
(
1
−
2
p
)
K
−
1
+
1
2
]
1\times[(p-\frac{1}{2})(1-2p)^{K-1}+\frac{1}{2}]
1×[(p−21)(1−2p)K−1+21]
其中
K
K
K是题目输入的
K
K
K
代码
//概率题
#include <bits/stdc++.h>
#define eps 1e-8
using namespace std;
typedef long long ll;
typedef long double ld;
ll n, m, q, K;
ld tot;
ll read(ll x=0)
{
ll c, f=1;
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-48;
return f*x;
}
ld solve()
{
ll i, j, k;
ld p, ans=0;
if(K==0)return ld(0);
for(i=1;i<=n;i++)for(j=1;j<=m;j++)for(k=1;k<=q;k++)
{
p = (2*i*(n-i+1)-1)*(2*j*(m-j+1)-1)*(2*k*(q-k+1)-1) / tot;
ans += (p-0.5)*pow(1.0-2.0*p,K-1)+0.5;
}
return ans;
}
int main()
{
ll T=read(), kase=0;
while(T--)
{
n=read(), m=read(), q=read(), K=read();
tot = n*m*q*n*m*q;
printf("Case %lld: %.10Lf\n",++kase,solve());
}
return 0;
}