题目
给你一个整数 N ( 1 < = N < = 1 0 5 ) N(1 <= N <= 10 ^ 5) N(1<=N<=105),每次 N N N会随机变成 N N N的某个因子,问期望几次会变成 1 1 1
分析
1. 画图理解期望
平均值
期望就是所有可能取值的平均值,即
E
(
x
)
=
∑
i
=
1
∞
X
i
E(x) = \sum_{i = 1}^{\infty} X_i
E(x)=i=1∑∞Xi
概率
期望也可以理解为概率,即
令
P
i
表示取到
X
i
的概率,则
E
(
x
)
=
∑
i
=
1
∞
P
i
×
X
i
令 P_i 表示取到X_i的概率 ,则 \\ E(x) = \sum_{i = 1}^{\infty}P_i \times X_i
令Pi表示取到Xi的概率,则E(x)=i=1∑∞Pi×Xi
i
∈
±
1
i\in{\pm1}
i∈±1
2.数学式的表达(dp)
令
d
p
x
表示整数
x
变成
1
的期望,
n
表示
x
的因数个数则
d
p
x
=
∑
i
∈
i
≡
0
(
m
o
d
x
)
d
p
i
n
+
1
令 dp_x表示整数x变成1的期望,n 表示 x 的 因数个数 则\\ dp_x = \frac{\sum_{i\in{i \equiv 0\pmod{x}}}dp_i}{n} + 1
令dpx表示整数x变成1的期望,n表示x的因数个数则dpx=n∑i∈i≡0(modx)dpi+1
但是
x
∈
i
≡
0
(
m
o
d
x
)
x \in{i \equiv 0\pmod{x} }
x∈i≡0(modx)所以不是dp,我们进行移向
得
d
p
x
=
(
∑
i
∈
i
≡
0
(
m
o
d
x
)
,
i
≠
x
d
p
i
)
+
n
n
−
1
dp_x = \frac{(\sum_{i\in{i \equiv 0\pmod{x},i \neq x}}{dp_i}) + n}{n - 1}
dpx=n−1(∑i∈i≡0(modx),i=xdpi)+n
初始化
d
p
1
=
0
dp_1 = 0
dp1=0即可转移
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int n;
double dp[N];
int main() {
scanf("%d", &n);
dp[1] = 0;
for (int i = 2; i <= n; i++) {
double sum = 0;
int cnt = 0;
for (int j = 1; j * j <= i; j++) {
if ( i % j == 0 ) {
cnt++;
sum += dp[j];
if (j * j != i) {
cnt ++;
sum += dp[i / j];
}
}
}
sum += cnt;
dp[i] = sum / (cnt - 1);
}
printf("%.2lf",dp[n]);
return 0;
}