Description
众所周知,DH是一位人生赢家,他不仅能虐暴全场,而且还正在走向人生巅峰;
在巅峰之路上,他碰到了这一题:
每次生成一个[0,n)[0,n)[0,n)的随机整数,如果这个随机数和给出的m个数字中的其中一个数字相等,那么就停止生成随机数,否则继续生成,求出所有生成的数的和的期望。
Input
第一行两个正整数 n,mn,mn,m
第二行 mmm 个整数 aia_iai 表示障碍,保证 aia_iai 两两不同。
Output
输出一行一个实数表示期望,保留6位小数,
注意了本题没有SPJ,必须和答案完全相同才能通过本题
2 1
1
Sample Output
1.000000
Data Constraint
对于 20% 的数据 , 满足 n≤10n \leq 10n≤10;
对于 30% 的数据 , 满足 n≤1000n \leq 1000n≤1000;
对于 50% 的数据 , 满足 n≤100000n \leq 100000n≤100000;
对于 100% 的数据 , 满足 n≤107,1≤m≤n,0≤ai≤n−1n \leq 10^7,1 \leq m \leq n, 0 \leq a_i \leq n-1n≤107,1≤m≤n,0≤ai≤n−1;
这道题我们可以将情况想象成一棵树,其中每一层有 nnn 个节点,其中 mmm 个节点不能继续往下走,如这样:

众所周知,期望是概率乘总和
我们可以知道,到这一层的概率为 :
n−mn\frac{n-m}{n}nn−m
即,共有 nnn 个点,其中 n−mn - mn−m 个可以走。
而从最上面到达这一层的概率为 :
(n−mn)i−1(\frac{n-m}{n})^{i-1}(nn−m)i−1
我们再推一步,将其设为 qqq
则∑i=1∞qi=a11−qn1−q\sum_{i=1}^{\infty} q^i = a_1\frac{1-q^n}{1-q}∑i=1∞qi=a11−q1−qn
而 a1a_1a1 为 1,∣q∣≤1|q| \leq 1∣q∣≤1
所以, q∞q^{\infty}q∞ 无限趋近于 0
所以概率为:
11−q\frac{1}{1-q}1−q1
即,
1mn=nm\frac{1}{\frac{m}{n}} = \frac{n}{m}nm1=mn
而总和我们可以用等差数列求和公式:
n(n+1)2\frac{n(n+1)}{2}2n(n+1)
据题目:
ai≤n−1a_i \leq n-1ai≤n−1
所以,总和为:
n(n−1)2\frac{n(n-1)}{2}2n(n−1)
所以,答案为:
(n−1)n2m\frac{(n-1)n}{2m}2m(n−1)n
最后附上code:
#include <bits/stdc++.h>
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;
}
话说,我都这么努力地写了,能点个赞吗?
我还只是个苦苦学习的孩子~~
文章讨论了在给定m个障碍的情况下,生成一个[0,n)随机整数序列并停止当与障碍之一相等的期望值问题。通过树模型和概率计算,得出期望值为(n-1)*n/2m。
369

被折叠的 条评论
为什么被折叠?



