problem link:http://acm.hdu.edu.cn/showproblem.php?pid=6239
题意
Alice和Bob去面试。参加面试的人共有n个,面试官会将前K(0<=K)个人,分到第1天,后n-K个人分到第二天。已知Alice在第二天,现给出Bob所在第几天。Alice是第二天第x个面试的,求x的数学期望。
思路
列出n=3 d=2 的所有情况(样例):
假设Alice为1号,Bob为2号
第一天 | 第二天 | 是否合法 |
---|---|---|
1 | 23 | 0 |
1 | 32 | 0 |
2 | 13 | 0 |
2 | 31 | 0 |
3 | 12 | 1 |
3 | 21 | 1 |
∅ | 123 | 1 |
∅ | 132 | 1 |
∅ | 213 | 1 |
∅ | 231 | 1 |
∅ | 312 | 1 |
∅ | 321 | 1 |
合法的情况共8种,因此数学期望为
1
∗
1
8
∗
3
+
2
∗
1
8
∗
3
+
3
∗
1
8
∗
2
=
15
8
1*\frac{1}{8}*3+2*\frac{1}{8}*3+3*\frac{1}{8}*2 = \frac{15}{8}
1∗81∗3+2∗81∗3+3∗81∗2=815
可以看出,划分第一天与第二天并不是等概率划分,因此不能直接去求每种情况的期望。
问题本身能够转化为古典概型。
所有情况即为
1
,
2
,
.
.
.
,
n
1,2,...,n
1,2,...,n个人的全排列(假设Alice是1号,Bob是2号)。
现在考虑d=1时的情况:
所有合法情况的总数为
A
=
∑
i
=
1
n
−
1
i
∗
(
n
−
i
)
∗
(
n
−
2
)
!
A = \sum_{i=1}^{n-1}i*(n-i)*(n-2)!
A=i=1∑n−1i∗(n−i)∗(n−2)!
设概率
P
(
X
=
k
)
P(X=k)
P(X=k)表示前k个人在第一天,后n-k个人在第二天的概率,则
P
(
X
=
k
)
=
k
∗
(
n
−
k
)
∗
(
n
−
2
)
!
A
P(X=k)=\frac{k*(n-k)*(n-2)!}{A}
P(X=k)=Ak∗(n−k)∗(n−2)!
第二天有n-k个人,易知Alice的面试编号的期望为
n
−
k
+
1
2
\frac{n-k+1}{2}
2n−k+1。
所以,设
E
(
Y
=
k
)
E(Y=k)
E(Y=k)表示前k个人在第一天,Alice的编号的期望。
E
(
Y
=
k
)
=
P
(
X
=
k
)
∗
n
−
k
+
1
2
E(Y=k)=P(X=k)*\frac{n-k+1}{2}
E(Y=k)=P(X=k)∗2n−k+1
最终结果
E
Y
=
∑
k
=
1
n
−
1
k
∗
(
n
−
k
)
∗
(
n
−
2
)
!
∗
(
n
−
k
+
1
)
A
∗
2
=
∑
k
=
1
n
−
1
k
∗
(
n
−
k
)
∗
(
n
−
k
+
1
)
2
∗
∑
i
=
1
n
−
1
i
∗
(
n
−
i
)
=
1
2
∗
∑
i
=
1
n
−
1
i
∗
(
n
−
i
)
∗
∑
k
=
1
n
−
1
k
∗
(
n
−
k
)
∗
(
n
−
k
+
1
)
\begin{aligned} EY&=\sum_{k=1}^{n-1}\frac{k*(n-k)*(n-2)!*(n-k+1)}{A*2} \\ &=\sum_{k=1}^{n-1}\frac{k*(n-k)*(n-k+1)}{ 2*\sum_{i=1}^{n-1}i*(n-i)}\\ &=\frac{1}{ 2*\sum_{i=1}^{n-1}i*(n-i)}*\sum_{k=1}^{n-1}k*(n-k)*(n-k+1) \end{aligned}
EY=k=1∑n−1A∗2k∗(n−k)∗(n−2)!∗(n−k+1)=k=1∑n−12∗∑i=1n−1i∗(n−i)k∗(n−k)∗(n−k+1)=2∗∑i=1n−1i∗(n−i)1∗k=1∑n−1k∗(n−k)∗(n−k+1)
式子推起来很麻烦,其中要用到:
∑
i
=
1
n
i
2
=
n
∗
(
n
+
1
)
∗
(
2
n
+
1
)
6
\sum_{i=1}^{n}i^2=\frac{n*(n+1)*(2n+1)}{6}
i=1∑ni2=6n∗(n+1)∗(2n+1)
∑
i
=
1
n
i
3
=
n
2
(
n
+
1
)
2
4
\sum_{i=1}^{n}i^3=\frac{n^2(n+1)^2}{4}
i=1∑ni3=4n2(n+1)2
最终可以推得
E
Y
=
n
+
2
4
EY=\frac{n+2}{4}
EY=4n+2
现在考虑d=2的情况。
所有合法情况的总数为
A
=
∑
i
=
0
n
−
2
(
n
−
i
)
∗
(
n
−
i
−
1
)
∗
(
n
−
2
)
!
A = \sum_{i=0}^{n-2}(n-i)*(n-i-1)*(n-2)!
A=i=0∑n−2(n−i)∗(n−i−1)∗(n−2)!
P
(
X
=
k
)
=
(
n
−
k
)
∗
(
n
−
k
−
1
)
∗
(
n
−
2
)
!
A
P(X=k)=\frac{(n-k)*(n-k-1)*(n-2)!}{A}
P(X=k)=A(n−k)∗(n−k−1)∗(n−2)!
E
(
Y
=
k
)
=
P
(
X
=
k
)
∗
n
−
k
+
1
2
E(Y=k)=P(X=k)*\frac{n-k+1}{2}
E(Y=k)=P(X=k)∗2n−k+1
最终结果
E
Y
=
∑
k
=
0
n
−
2
(
n
−
k
)
∗
(
n
−
k
−
1
)
∗
(
n
−
2
)
!
∗
(
n
−
k
+
1
)
A
∗
2
=
∑
k
=
0
n
−
2
(
n
−
k
)
∗
(
n
−
k
−
1
)
∗
(
n
−
k
+
1
)
2
∗
∑
i
=
0
n
−
2
(
n
−
i
)
∗
(
n
−
i
−
1
)
=
1
2
∗
∑
i
=
0
n
−
2
(
n
−
i
)
∗
(
n
−
i
−
1
)
∗
∑
k
=
0
n
−
2
(
n
−
k
)
∗
(
n
−
k
−
1
)
∗
(
n
−
k
+
1
)
\begin{aligned} EY&=\sum_{k=0}^{n-2}\frac{(n-k)*(n-k-1)*(n-2)!*(n-k+1)}{A*2} \\ &=\sum_{k=0}^{n-2}\frac{(n-k)*(n-k-1)*(n-k+1)} { 2*\sum_{i=0}^{n-2}(n-i)*(n-i-1)}\\ &=\frac{1}{ 2*\sum_{i=0}^{n-2}(n-i)*(n-i-1)}*\sum_{k=0}^{n-2}(n-k)*(n-k-1)*(n-k+1){} \end{aligned}
EY=k=0∑n−2A∗2(n−k)∗(n−k−1)∗(n−2)!∗(n−k+1)=k=0∑n−22∗∑i=0n−2(n−i)∗(n−i−1)(n−k)∗(n−k−1)∗(n−k+1)=2∗∑i=0n−2(n−i)∗(n−i−1)1∗k=0∑n−2(n−k)∗(n−k−1)∗(n−k+1)
最终可以推得
E
Y
=
3
n
+
6
8
EY=\frac{3n+6}{8}
EY=83n+6
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld double
#define ull unsigned long long
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
const int maxn = 5e5 + 10;
const ll mod = 1e9 + 7;
ll pow_mod(ll a, ll b, ll m) {
ll ans = 1;
while (b > 0) {
if ((b & 1) != 0) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
int main() {
__;
int _;
cin >> _;
for (int sce = 1; sce <= _; ++sce) {
ll n, d;
cin >> n >> d;
if (d == 1)cout << (n + 2) * pow_mod(4, mod - 2, mod) % mod << endl;
else cout << (3 * n + 6) * pow_mod(8, mod - 2, mod) % mod << endl;
}
return 0;
}