正题
题目链接:https://www.luogu.org/problemnew/show/P1943
题目大意
定义LocalLocalLocal数为一个数且比它前面的数字都要大。
求一个随机长度为nnn的序列中LoaclLoaclLoacl数的期望数量。
解题思路
ans=Local(a)n!ans=\frac{Local(a)}{n!}ans=n!Local(a)
现在我们分开求,先考虑如何求出所有序列中LocalLocalLocal数的数量
一个数xxx,有x−1x-1x−1个数比他小,那么若一个数成为LocalLocalLocal数的排列数是
∑k=1xPk−1x−1∗Pn−xn−x=Px−1k−1∗(n−x)!\sum_{k=1}^xP_{k-1}^{x-1}*P_{n-x}^{n-x}=P^{k-1}_{x-1}*(n-x)!k=1∑xPk−1x−1∗Pn−xn−x=Px−1k−1∗(n−x)!
也就是答案为
∑x=1n∑k=1x(Px−1−1)∗(n−x)!n!\sum_{x=1}^n\frac{\sum_{k=1}^x(P^{-1}_{x-1})*(n-x)!}{n!}x=1∑nn!∑k=1x(Px−1−1)∗(n−x)!
打表得(我不会证明啊)
⇒∑x=1n1x\Rightarrow \sum_{x=1}^n\frac{1}{x}⇒x=1∑nx1
然后过掉n≤1000000n \leq 1000000n≤1000000的点,然后使出调和级数
∑x=1n1x=log(n+1)+r(n→∞)\sum_{x=1}^n\frac{1}{x}=\log (n+1)+r(n\rightarrow \infty)x=1∑nx1=log(n+1)+r(n→∞)
rrr为欧拉函数r≈0.5772156649r\approx 0.5772156649r≈0.5772156649
鬼知道考试的时候谁做的出来\color{white}\text{鬼知道考试的时候谁做的出来}鬼知道考试的时候谁做的出来
codecodecode
// luogu-judger-enable-o2
#include<cstdio>
#include<cmath>
using namespace std;
double n,ans;
int main()
{scanf("%lf",&n);if(n<=1000000)for(int i=1;i<=n;i++)ans+=((double)1/i);else ans=log(n+1)+0.5772156649;printf("%.8lf",ans);
}