小魔女帕琪

小魔女帕琪

a1,a2,...,a7a1,a2,...,a7个对应的1,2,...,71,2,...,7进行排列,询问其中出现1,2,...,71,2,...,7的全排列的个数的期望,a1+a2+a3+a4+a5+a6+a7<=10^9。

显然数据范围不支持递推方程,于是猜测为条件概率问题,即前后概率发生有联系,通常相等,于是设其中一个状态,不妨设在第n个位置到最后一个位置,出现了一次1234567的全排列期望,为(设此时有12..7,a1,...,a7a1,...,a7个,其和为n)

7!7i=1ai7i=1(ni+1)7!7i=1ai7i=1(ni+1)

在考虑n+1个位置出现全排列的期望,不难得知有

7!(a11)7i=1ai7i=1(ni+1)7!(a11)7i=1ai7i=1(ni+1)

7!(a21)7i=1ai7i=1(ni+1)7!(a21)7i=1ai7i=1(ni+1)

........

累加我们有

7!(a11+a21+...+a71)7i=1ai7i=1(ni+1)=7!(a11+a21+...+a71)7i=1ai7i=1(ni+1)=

7!7i=1ai7i=1(ni+1)7!7i=1ai7i=1(ni+1)

于是我们得知任何一个位置到终点的期望与下一个位置到终点的期望都相同,根据数学归纳法,当然递归更好理解,于是我们得知任何一个地方出现全排列概率都是相同的。

于是

ans=7!7i=1ai7i=1(ni+1)(n7+1)=ans=7!7i=1ai7i=1(ni+1)(n7+1)=

7!7i=1ai6i=1(ni+1)7!7i=1ai6i=1(ni+1)

代入式子计算即可。

参考代码:

#include <iostream>
#include <cstdio>
#define il inline
#define ri register
using namespace std;
double a[7];
int main(){
    ri int i,n(0);double ans(1);
    for(i=0;i<7;++i)
        scanf("%lf",&a[i]),n+=a[i];
    for(i=0;i<6;++i)
        ans*=a[i],ans*=(i+1),ans/=(n-i);
    ans*=a[i],ans*=(i+1);
    printf("%.3lf",ans);
    return 0;
}

posted @   a1b3c7d9  阅读(124)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示