众所周知,DH是一位人生赢家,他不仅能虐暴全场,而且还正在走向人生巅峰;
在巅峰之路上,他碰到了这一题:
每次生成一个 [ 0 , n ) [0,n) [0,n)的随机整数,如果这个随机数和给出的m个数字中的其中一个数字相等,那么就停止生成随机数,否则继续生成,求出所有生成的数的和的期望。
第一行两个正整数 n , m n,m n,m
第二行 m m m 个整数 a i a_i ai 表示障碍,保证 a i a_i ai 两两不同。
输出一行一个实数表示期望,保留6位小数,
注意了本题没有SPJ,必须和答案完全相同才能通过本题
2 1
1
Sample Output
1.000000
Data Constraint
对于 20% 的数据 , 满足 n ≤ 10 n \leq 10 n≤10;
对于 30% 的数据 , 满足 n ≤ 1000 n \leq 1000 n≤1000;
对于 50% 的数据 , 满足 n ≤ 100000 n \leq 100000 n≤100000;
对于 100% 的数据 , 满足 n ≤ 1 0 7 , 1 ≤ m ≤ n , 0 ≤ a i ≤ n − 1 n \leq 10^7,1 \leq m \leq n, 0 \leq a_i \leq n-1 n≤107,1≤m≤n,0≤ai≤n−1;
这道题我们可以将情况想象成一棵树,其中每一层有 n n n 个节点,其中 m m m 个节点不能继续往下走,如这样:
众所周知,期望是概率乘总和
我们可以知道,到这一层的概率为 :
n − m n \frac{n-m}{n} nn−m
即,共有 n n n 个点,其中 n − m n - m n−m 个可以走。
而从最上面到达这一层的概率为 :
( n − m n ) i − 1 (\frac{n-m}{n})^{i-1} (nn−m)i−1
我们再推一步,将其设为 q q q
则 ∑ i = 1 ∞ q i = a 1 1 − q n 1 − q \sum_{i=1}^{\infty} q^i = a_1\frac{1-q^n}{1-q} ∑i=1∞qi=a11−q1−qn
而 a 1 a_1 a1 为 1, ∣ q ∣ ≤ 1 |q| \leq 1 ∣q∣≤1
所以, q ∞ q^{\infty} q∞ 无限趋近于 0
所以概率为:
1 1 − q \frac{1}{1-q} 1−q1
即,
1 m n = n m \frac{1}{\frac{m}{n}} = \frac{n}{m} nm1=mn
而总和我们可以用等差数列求和公式:
n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1)
据题目:
a i ≤ n − 1 a_i \leq n-1 ai≤n−1
所以,总和为:
n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n−1)
所以,答案为:
( n − 1 ) n 2 m \frac{(n-1)n}{2m} 2m(n−1)n
最后附上code:
#include
using namespace std;
int n,m;
int main(){
scanf("%d %d",&n,&m);
double ans=(double)(n-1)*(double)n/m*0.5;
printf("%.6lf",ans);
return 0;
}
话说,我都这么努力地写了,能点个赞吗?
我还只是个苦苦学习的孩子~~