昆明2022ICPC-C题
题目
https://ac.nowcoder.com/acm/contest/32708/C
考虑期望,
\[\begin{align*}
Ans=&P(n=1)\times 1+P(n=2)\times 2+P(n=3)\times 3+\cdots\\
=&(P(n\geq1)-P(n\geq2))\times 1+(P(n\geq2)-P(n\geq3))\times 2+(P(n\geq3)-P(n\geq4))\times 3+\cdots\\
=&P(n\geq1)+P(n\geq2)+P(n\geq3)+\cdots\\
\end{align*}
\]
考虑\(P(n\geq k)\),
\[P(n\geq k)=\frac{\{(x_0,x_1,\cdots,x_{k-1})\in \R^k|\sum_{i=0}^{k-1}x_i< 1,\forall i,0\leq x_i\leq x \}}
{\{(x_0,x_1,\cdots,x_{k-1})\in R^k|\forall i,0\leq x_i\leq x \}}
\]
这样就转变成了上下两个点集的体积比。
考虑分母
//已知结论,n-标准单纯形与原点围成的体积是\(\frac{1}{n!}\),也就是说
\[V(\{(x_0,x_1,\cdots,x_{k-1})\in \R^k|\forall i,0\leq x_i\leq x \})=x^k
\]
考虑\(x\geq 1\),
\[\begin{align*}
分子=&\{(x_0,x_1,\cdots,x_{k-1})\in R^k|\sum_{i=0}^{k-1}x_i < 1,\forall i,0\leq x_i\leq x \}\\
=&\{(x_0,x_1,\cdots,x_{k-1})\in R^k|\sum_{i=0}^{k-1}x_i < 1 \}\quad(因为x\leq 1\leq x)\\
=&\{(s_0,s_1,\cdots,s_{k-1})\in R^k|0\leq s_0 \leq s_1 \leq \cdots\leq s_{k-1} < 1\}\\
\end{align*}
\]
相当于在长度为1的线段上随机取k个不同的点(因为实数轴上随机取有限个点,能取到两个点完全一样的概率为0,于是不考虑这种情况),若这k个点正好递增则满足条件,概率为\(\frac{1}{k!}\)(因为有\(k!\)种排列方式)
所以
\[\begin{align*}
分子=&\frac{1}{k!}\\
P(n\geq k)=&\frac{1}{k!}\times \frac{1}{x^k}\\
Ans=&\sum_{k=1}^{\infin} \frac{1}{k!}\times \frac{1}{x^k}=e^{\frac{1}{x}}
\end{align*}
\]
考虑分子
\[\begin{align*}
分子=&\{(x_0,x_1,\cdots,x_{k-1})\in R^k|\sum_{i=0}^{k-1}x_i < 1,\forall i,0\leq x_i\leq x \}\\
\end{align*}
\]
思及容斥,
可将分子变形为
\[\begin{align*}
分子=&\{(x_0,x_1,\cdots,x_{k-1})\in R^k|\sum_{i=0}^{k-1}x_i < 1\}
-\sum_{j=0}^{k-1}\{(x_0,x_1,\cdots,x_{k-1})\in \R^k|\sum_{i=0}^{k-1}x_i < 1,x_j>x\}\\
=&\{(x_0,x_1,\cdots,x_{k-1})\in R^k|\sum_{i=0}^{k-1}x_i < 1\}\\
&-\sum_{j=1}^{k}(-1)^jC_{k}^{j}\times \{(x_0,x_1,\cdots,x_{k-1})\in \R^k|\sum_{i=0}^{k-1}x_i < 1,只考虑给定的j个位置,这里的x_i>x,这里以前j项>x为例\}\\
=&1-\sum_{j=1}^{k}(-1)^jC_{k}^{j}\frac{1}{k!}(1-jx)^k
\end{align*}
\]
注意,以上所有枚举的\(j\)满足\(1-jx>0\)。
相当于,在长度为\(1-jx\) 的线段上跟上面一样先用前n项和随机取点然后差分得到\((x_0,x_1,\cdots,x_{k-1})\)。
然后分子也可以把1合并进去
\[\begin{align*}
分子=&\sum_{j=0}^{k}(-1)^jC_{k}^{j}\frac{1}{k!}(1-jx)^k
\end{align*}
\]
那么,
\[\begin{align*}
P(n\geq k)=&\sum_{j=0}^{k}(-1)^jC_{k}^{j}\frac{1}{k!}(1-jx)^k\times \frac{1}{x^k}\\
=&\sum_{j=0}^{k}(-1)^j\frac{1}{(k-j)!j!}(\frac{1-jx}{x})^k\\
Ans=&\sum_{k=1}^{\infin}\sum_{j=0}^{k}(-1)^j\frac{1}{(k-j)!j!}(\frac{1-jx}{x})^k\\
=&\sum_{1-jx\geq 0}\sum_{k=j}^{\infin} \frac{(-1)^j}{j!}\frac{(\frac{1-jx}{x})^k}{(k-j)!}\\
=&\sum_{1-jx\geq 0}\frac{(-1)^j}{j!}\sum_{k=j}^{\infin}\frac{(\frac{1-jx}{x})^{k-i}}{(k-j)!}(\frac{1-jx}{x})^{j}\\
=&\sum_{1-jx\geq 0}\frac{(-1)^j}{j!}\sum_{k=j}^{\infin}\frac{(\frac{1-jx}{x})^{k-j}}{(k-j)!}(\frac{1-jx}{x})^{j}\\
=&\sum_{1-jx\geq 0}\frac{(-1)^j}{j!}e^{\frac{1-jx}{x}}(\frac{1-jx}{x})^{j}\\
\end{align*}
\]
带入当\(x\geq 1\)的情况,会发现也成立。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int T;double x;
scanf("%d",&T);
while(T--){
scanf("%lf",&x);
double ans=0,p=1;
int k=1;
for(int i=0;1-i*x>=0;i++){
ans+=p*k*pow((1-i*x)/x,i)*exp((1.0-i*x)/x);
k*=-1;p/=(i+1);
}
printf("%.15f\n",ans);
}
}
参考链接
https://www.zhihu.com/question/528099946
参考CHSWang 的答案,补了一些细节。
https://zhuanlan.zhihu.com/p/442216331
谢谢教我配PicGo图床,谢谢
评价
真优美,猫猫发出“啧”的声音。