A-擅长解密的小红同学
设密码有 N N N中可能,那么每次猜中的概率为: P = 1 N P=\frac{1}{N} P=N1
那么,猜了 k k k次猜中的概率为: P ( X = k ) = ( 1 − P ) k − 1 P P(X=k)=(1-P)^{k-1}P P(X=k)=(1−P)k−1P,即前 k − 1 k-1 k−1次都没猜中,而第 k k k次猜中。
则,期望为:
E
[
X
]
=
∑
k
≥
1
k
⋅
P
(
X
=
k
)
=
∑
k
≥
1
k
⋅
(
1
−
P
)
k
−
1
P
\mathbb{E}[X]=\sum_{k\ge 1}k\cdot P(X=k)=\sum_{k\ge 1}k\cdot (1-P)^{k-1}P
E[X]=k≥1∑k⋅P(X=k)=k≥1∑k⋅(1−P)k−1P
根据无穷级数的知识,可知:
∑
k
≥
1
k
⋅
x
k
−
1
=
(
∫
0
x
∑
k
≥
1
k
⋅
t
k
−
1
d
t
)
′
=
(
∑
k
≥
1
x
k
)
′
=
(
x
1
−
x
)
′
=
1
(
1
−
x
)
2
\sum_{k\ge 1}k\cdot x^{k-1}=(\int _{0}^{x}\sum_{k\ge 1}k\cdot t^{k-1}dt)'=(\sum_{k\ge 1}x^k)'=(\frac{x}{1-x})'=\frac{1}{(1-x)^2}
k≥1∑k⋅xk−1=(∫0xk≥1∑k⋅tk−1dt)′=(k≥1∑xk)′=(1−xx)′=(1−x)21
将期望的式子化简:
E
[
X
]
=
1
(
1
−
(
1
−
P
)
)
2
P
=
1
P
=
N
\mathbb{E}[X]=\frac{1}{(1-(1-P))^2}P=\frac{1}{P}=N
E[X]=(1−(1−P))21P=P1=N
其中
N
N
N的值为:
N
=
(
∑
i
=
1
n
a
[
i
]
a
[
1
]
,
a
[
2
]
,
.
.
,
a
[
n
]
)
=
(
∑
i
=
1
n
a
[
i
]
)
!
∏
i
=
1
n
(
a
[
i
]
!
)
N=\binom{\sum_{i=1}^na[i]}{a[1],a[2],..,a[n]}=\frac{(\sum_{i=1}^na[i])!}{\prod_{i=1}^n(a[i]!)}
N=(a[1],a[2],..,a[n]∑i=1na[i])=∏i=1n(a[i]!)(∑i=1na[i])!
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 1e9 + 7;
const int N = 1e7 + 10;
ll power(ll a, ll b) {
ll res = 1;
while (b) {
if (b & 1) res = res * a % mod;
b >>= 1;
a = a * a % mod;
}
return res;
}
int a[10];
ll sum = 0, fac[N];
int main() {
for (int i = 0; i < 10; i++) {
cin >> a[i];
sum += a[i];
}
// 预处理阶乘
fac[0] = 1;
for (int i = 1; i <= N - 10; i++) fac[i] = i * fac[i - 1] % mod;
ll res = fac[sum];
for (int i = 0; i < 10; i++) res = res * power(fac[a[i]], mod - 2) % mod;
cout << res;
return 0;
}
B-increment of coins
定义 d p ( i , j , k ) dp(i,j,k) dp(i,j,k)为背包中分别有 i i i枚金币, j j j枚银币, k k k枚铜币时,操作次数的期望。
末态为已经存在某一种硬币有100枚,即
d
p
(
100
,
i
,
j
)
=
d
p
(
i
,
100
,
j
)
=
d
p
(
i
,
j
,
100
)
=
0
;
dp(100,i,j) = dp(i,100,j) = dp(i,j,100) = 0;
dp(100,i,j)=dp(i,100,j)=dp(i,j,100)=0;
状态转移方程为:
d
p
(
i
,
j
,
k
)
=
1.0
+
i
×
d
p
(
i
+
1
,
j
,
k
)
+
j
×
d
p
(
i
,
j
+
1
,
k
)
+
k
×
d
p
(
i
,
j
,
k
+
1
)
i
+
j
+
k
dp(i,j,k) = 1.0 + \frac{i \times dp(i + 1,j,k) + j \times dp(i,j + 1,k) + k \times dp(i,j,k + 1)} {i + j + k}
dp(i,j,k)=1.0+i+j+ki×dp(i+1,j,k)+j×dp(i,j+1,k)+k×dp(i,j,k+1)
#include <bits/stdc++.h>
using namespace std;
const int N = 100 + 10;
double dp[N][N][N];
int a, b, c;
int main() {
for (int i = 0; i <= 100; i++)
for (int j = 0; j <= 100; j++)
dp[100][i][j] = dp[i][100][j] = dp[i][j][100] = 0;
cin >> a >> b >> c;
for (int i = 99; i >= a; i--)
for (int j = 99; j >= b; j--)
for (int k = 99; k >= c; k--)
dp[i][j][k] = 1.0 + (i * dp[i + 1][j][k] + j * dp[i][j + 1][k] +
k * dp[i][j][k + 1]) /
(i + j + k);
printf("%.9lf", dp[a][b][c]);
return 0;
}
C-Little Pony and Expected Maximum
定义 P ( Y = y ) P(Y=y) P(Y=y)为投 n n n次,得到最大点数为 y y y的概率,但是这个值直接计算比较难。
可以先定义 P ( Y ≤ y ) P(Y\le y) P(Y≤y)为最大点数小于 y y y的概率,则 P ( Y = y ) = P ( Y ≤ y ) − P ( Y ≤ y − 1 ) P(Y=y)=P(Y\le y)-P(Y\le y-1) P(Y=y)=P(Y≤y)−P(Y≤y−1)
P ( Y ≤ y ) = P ( x 1 ≤ y , x 2 ≤ y , . . . , x n ≤ y ) = P ( X ≤ y ) n = ( y m ) n \begin{matrix} P(Y\le y)&=&P(x_1\le y,x_2\le y,...,x_n\le y) \\ \\ &=&P(X\le y)^n \\ \\ &=&(\frac{y}{m})^n \end{matrix} P(Y≤y)===P(x1≤y,x2≤y,...,xn≤y)P(X≤y)n(my)n
期望为:
E
[
Y
]
=
∑
y
=
1
m
y
⋅
P
(
Y
=
y
)
=
∑
y
=
1
m
y
⋅
[
(
y
m
)
n
−
(
y
−
1
m
)
n
]
\mathbb{E}[Y]=\sum_{y=1}^my\cdot P(Y=y)=\sum_{y=1}^my\cdot [ (\frac{y}{m})^n-(\frac{y-1}{m})^n ]
E[Y]=y=1∑my⋅P(Y=y)=y=1∑my⋅[(my)n−(my−1)n]
#include <bits/stdc++.h>
using namespace std;
double power(double a, int b) {
double res = 1.0;
while (b) {
if (b & 1) res = res * a;
b >>= 1;
a = a * a;
}
return res;
}
int n, m;
int main() {
cin >> m >> n;
double res = 0;
for (int i = 1; i <= m; i++)
res += i * (power(1.0 * i / m, n) - power(1.0 * (i - 1) / m, n));
printf("%.12lf", res);
return 0;
}
D-New Year and Arbitrary Arrangement
定义 d p ( i , j ) dp(i,j) dp(i,j)为子序列"ab"的个数为 i i i且存在 j j j个"a"时的期望。
状态转移为:
d
p
(
i
,
j
)
=
P
a
P
a
+
P
b
d
p
(
i
,
j
+
1
)
+
P
b
P
a
+
P
b
d
p
(
i
+
j
,
j
)
dp(i,j)=\frac{P_a}{P_a+P_b}dp(i,j+1)+\frac{P_b}{P_a+P_b}dp(i+j,j)
dp(i,j)=Pa+PbPadp(i,j+1)+Pa+PbPbdp(i+j,j)
特殊的,当
i
=
0
,
j
=
0
i=0, j=0
i=0,j=0时:
d
p
(
0
,
0
)
=
P
a
P
a
+
P
b
d
p
(
0
,
1
)
+
P
b
P
a
+
P
b
d
p
(
0
,
0
)
=
d
p
(
0
,
1
)
\begin{matrix} dp(0,0)&=&\frac{P_a}{P_a+P_b}dp(0,1)+\frac{P_b}{P_a+P_b}dp(0,0)\\ \\ &=&dp(0,1) \\ \\ \end{matrix}
dp(0,0)==Pa+PbPadp(0,1)+Pa+PbPbdp(0,0)dp(0,1)
如果我一直不选"b",那么 d p ( i , j ) dp(i,j) dp(i,j)的 j j j就会增大到无限,这显然是不行的。
当
i
+
j
≥
k
i+j\ge k
i+j≥k时,只要选取一个"b",就能到达末态:
d
p
(
i
,
j
)
=
P
b
P
a
+
P
b
(
i
+
j
)
+
P
a
P
b
(
P
a
+
P
b
)
2
(
i
+
j
+
1
)
+
P
a
2
P
b
(
P
a
+
P
b
)
3
(
i
+
j
+
2
)
.
.
.
=
∑
t
≥
0
P
a
t
P
b
(
P
a
+
P
b
)
t
+
1
(
i
+
j
+
t
)
=
(
i
+
j
)
P
b
P
a
+
P
b
∑
t
≥
0
(
P
a
P
a
+
P
b
)
t
+
P
a
P
b
(
P
a
+
P
b
)
2
∑
t
≥
1
(
P
a
P
a
+
P
b
)
t
−
1
⋅
t
=
(
i
+
j
)
P
b
P
a
+
P
b
1
1
−
P
a
P
a
+
P
b
+
P
a
P
b
(
P
a
+
P
b
)
2
(
∑
t
≥
1
(
P
a
P
a
+
P
b
)
t
)
′
=
(
i
+
j
)
P
b
P
a
+
P
b
1
1
−
P
a
P
a
+
P
b
+
P
a
P
b
(
P
a
+
P
b
)
2
(
P
a
P
a
+
P
b
1
−
P
a
P
a
+
P
b
)
′
=
(
i
+
j
)
P
b
P
a
+
P
b
1
P
b
P
a
+
P
b
+
P
a
P
b
(
P
a
+
P
b
)
2
1
(
1
−
P
a
P
a
+
P
b
)
2
=
i
+
j
+
P
a
P
b
\begin{matrix} dp(i,j)&=&\frac{P_b}{P_a+P_b}(i+j)+\frac{P_aP_b}{(P_a+P_b)^2}(i+j+1)+\frac{P_a^2P_b}{(P_a+P_b)^3}(i+j+2)...\\ \\ &=&\sum_{t\ge0}\frac{P_a^tP_b}{(P_a+P_b)^{t+1}}(i+j+t) \\ \\ &=&(i+j) \frac{P_b}{P_a+P_b}\sum_{t\ge0}(\frac{P_a}{P_a+P_b})^t+\frac{P_aP_b}{(P_a+P_b)^2}\sum_{t\ge1}(\frac{P_a}{P_a+P_b})^{t-1}\cdot t \\ \\ &=&(i+j) \frac{P_b}{P_a+P_b}\frac{1}{1-\frac{P_a}{P_a+P_b}}+\frac{P_aP_b}{(P_a+P_b)^2}(\sum_{t\ge1}(\frac{P_a}{P_a+P_b})^t)' \\ \\ &=&(i+j) \frac{P_b}{P_a+P_b}\frac{1}{1-\frac{P_a}{P_a+P_b}}+\frac{P_aP_b}{(P_a+P_b)^2}(\frac{\frac{P_a}{P_a+P_b}}{1-\frac{P_a}{P_a+P_b}})' \\ \\ &=&(i+j) \frac{P_b}{P_a+P_b}\frac{1}{\frac{P_b}{P_a+P_b}}+\frac{P_aP_b}{(P_a+P_b)^2}\frac{1}{(1-\frac{P_a}{P_a+P_b})^2} \\ \\ &=&i+j+\frac{P_a}{P_b} \end{matrix}
dp(i,j)=======Pa+PbPb(i+j)+(Pa+Pb)2PaPb(i+j+1)+(Pa+Pb)3Pa2Pb(i+j+2)...∑t≥0(Pa+Pb)t+1PatPb(i+j+t)(i+j)Pa+PbPb∑t≥0(Pa+PbPa)t+(Pa+Pb)2PaPb∑t≥1(Pa+PbPa)t−1⋅t(i+j)Pa+PbPb1−Pa+PbPa1+(Pa+Pb)2PaPb(∑t≥1(Pa+PbPa)t)′(i+j)Pa+PbPb1−Pa+PbPa1+(Pa+Pb)2PaPb(1−Pa+PbPaPa+PbPa)′(i+j)Pa+PbPbPa+PbPb1+(Pa+Pb)2PaPb(1−Pa+PbPa)21i+j+PbPa
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3 + 10;
const int mod = 1e9 + 7;
ll power(ll a, ll b) {
ll res = 1;
while (b) {
if (b & 1) res = res * a % mod;
b >>= 1;
a = a * a % mod;
}
return res;
}
ll inv(ll x) { return power(x, mod - 2); }
ll k, pa, pb, dp[N][N];
ll res = 0;
int main() {
cin >> k >> pa >> pb;
ll qa = pa * inv((pa + pb) % mod) % mod;
ll qb = pb * inv((pa + pb) % mod) % mod;
for (int i = k - 1; i >= 0; i--) {
for (int j = k; j >= 1; j--) {
if (i + j >= k)
dp[i][j] = ((i + j) % mod + pa * inv(pb) % mod) % mod;
else
dp[i][j] =
(qb * dp[i + j][j] % mod + qa * dp[i][j + 1] % mod) % mod;
}
}
dp[0][0] = dp[0][1];
cout << dp[0][0];
return 0;
}
G-Messages
定义 X = ∑ i n x i X=\sum_{i}^nx_i X=∑inxi为读到需要的信息的学生的数量,其中 x i x_i xi为第 i i i个学生是否读到自己需要的信息,如果读到就为 1 1 1,否则为 0 0 0。
根据期望的可加性可知:
E
(
X
)
=
E
(
x
1
)
+
E
(
x
2
)
+
.
.
+
E
(
x
n
)
\mathbb{E}(X)=\mathbb{E}(x_1)+\mathbb{E}(x_2)+..+\mathbb{E}(x_n)
E(X)=E(x1)+E(x2)+..+E(xn)
对于每一个
E
(
x
i
)
\mathbb{E}(x_i)
E(xi)来说:
E
(
x
i
)
=
1
⋅
P
(
第
i
个
学
生
读
到
m
i
)
+
0
⋅
P
(
第
i
个
学
生
没
有
读
到
m
i
)
=
1
⋅
P
(
第
i
个
学
生
读
到
m
i
)
=
P
i
\begin{matrix} \mathbb{E}(x_i)&=&1\cdot P(第i个学生读到m_i)+0\cdot P(第i个学生没有读到m_i) \\ \\ &=&1\cdot P(第i个学生读到m_i) \\ \\ &=&P_i \end{matrix}
E(xi)===1⋅P(第i个学生读到mi)+0⋅P(第i个学生没有读到mi)1⋅P(第i个学生读到mi)Pi
故:
E
(
X
)
=
∑
i
=
1
n
E
(
x
i
)
=
∑
i
=
1
n
P
i
\mathbb{E}(X)=\sum_{i=1}^n\mathbb{E}(x_i)=\sum_{i=1}^nP_i
E(X)=i=1∑nE(xi)=i=1∑nPi
若顶置的消息集合为:
U
=
<
u
1
,
u
2
,
.
.
.
,
u
t
>
U=<u_1,u_2,...,u_t>
U=<u1,u2,...,ut>,则:
P
i
=
{
0
,
如
果
m
i
∉
U
1
,
如
果
m
i
∈
U
且
t
≤
k
i
k
i
t
,
如
果
m
i
∈
U
且
t
>
k
i
P_i= \begin{cases} 0, & 如果m_i\notin U \\ 1, & 如果m_i\in U且t\le k_i \\ \frac{k_i}{t}, & 如果m_i\in U且t> k_i \end{cases}
Pi=⎩⎪⎨⎪⎧0,1,tki,如果mi∈/U如果mi∈U且t≤ki如果mi∈U且t>ki
因为我们要选取一个集合 U U U使得期望 E ( X ) \mathbb{E}(X) E(X)最大,所以当 t t t固定时,我们可以贪心的选取集合 U U U。
又因
1
≤
k
i
≤
20
1\le k_i\le 20
1≤ki≤20,故当
n
≥
t
>
20
n\ge t> 20
n≥t>20时,
P
i
=
k
i
t
P_i=\frac{k_i}{t}
Pi=tki:
E
(
X
)
=
∑
i
=
1
n
P
i
=
∑
i
=
1
n
k
i
t
=
1
t
∑
i
=
1
n
k
i
\mathbb{E}(X)=\sum_{i=1}^nP_i=\sum_{i=1}^n\frac{k_i}{t}=\frac{1}{t}\sum_{i=1}^nk_i
E(X)=i=1∑nPi=i=1∑ntki=t1i=1∑nki
需要先将
k
i
k_i
ki的值排序并做前缀和,然后再枚举
t
t
t的值。
当 t ≤ 20 t\le 20 t≤20时,可以暴力枚举。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m[N], k[N];
double f(int t) { // 固定t时的最优选取
unordered_map<int, double> val;
for (int i = 1; i <= n; i++) {
if (t <= k[i])
val[m[i]] += 1;
else
val[m[i]] += (1.0 * k[i]) / t;
}
vector<pair<int, double>> vec;
for (auto it : val) vec.push_back({it.first, it.second});
sort(vec.begin(), vec.end(),
[](auto a, auto b) { return a.second > b.second; });
double sum = 0;
for (int i = 0; i < min(t, (int)vec.size()); i++) sum += vec[i].second;
return sum;
}
void print(int t) {
unordered_map<int, double> val;
for (int i = 1; i <= n; i++) {
if (t <= k[i])
val[m[i]] += 1;
else
val[m[i]] += 1.0 * k[i] / t;
}
vector<pair<int, double>> vec;
for (auto it : val) vec.push_back({it.first, it.second});
sort(vec.begin(), vec.end(),
[](auto a, auto b) { return a.second > b.second; });
cout << t << "\n";
for (int i = 0; i < t; i++) cout << vec[i].first << " ";
}
double maxn = -1;
int res = -1;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> m[i] >> k[i];
// 当1 < t <= 20时
for (int t = 1; t <= 20; t++) {
double sum = f(t);
if (sum > maxn) maxn = sum, res = t;
}
// 预处理:排序,前缀和
unordered_map<int, double> val;
for (int i = 1; i <= n; i++) val[m[i]] += k[i];
vector<pair<int, double>> vec;
for (auto it : val) vec.push_back({it.first, it.second});
sort(vec.begin(), vec.end(),
[](auto a, auto b) { return a.second > b.second; });
for (int i = 1; i < vec.size(); i++) vec[i].second += vec[i - 1].second;
// 当t > 20时
for (int t = 21; t <= vec.size(); t++) {
double tmp = 1.0 * vec[t - 1].second / t;
if (tmp > maxn) maxn = tmp, res = t;
}
print(res); // 输出结果
return 0;
}