昆明2022ICPC-C题

昆明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*} \]

思及容斥,

image-20220421130244469

可将分子变形为

\[\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图床,谢谢

评价

真优美,猫猫发出“啧”的声音。

posted @ 2022-04-21 22:29  zx0710  阅读(267)  评论(0编辑  收藏  举报