[概率期望]TheSwaps

题目描述

Alice得到了一个整数, 她将其视作长度为n的字符串S。为了好玩,她进行了k次如下操作:
1) 随机选取两个不同的位置x和y(即每次操作, {

分析

显然的概率期望
ans=ni=1× a n s = ∑ i = 1 n 每 位 期 望 值 × 每 位 被 选 出 的 概 率
第i位被求出的概率为 i×(ni+1)n×(n+1)/2 i × ( n − i + 1 ) n × ( n + 1 ) / 2
那么k次交换后期望值为?
我们设q次交换后第i位数位仍等于初始数位的概率,那么有:
q=q×(1n1n×(n1)/2)+1qn×(n1)/2 q = q × ( 1 − n − 1 n × ( n − 1 ) / 2 ) + 1 − q n × ( n − 1 ) / 2
然后有性质:如果第i位不为ai,那么第i位是a中其他任何数的概率都是一样的。
因此如果k次交换后,第i位为ai的概率是x。
那么第i位的期望值为 ai×x+sumain1×(1x) a i × x + s u m − a i n − 1 × ( 1 − x )
为了满足题目的基本精度要求,我只输出了七位小数

#include <iostream>
#include <cstdio>
#include <cstring>
#define rep(i,a,b) for (i=a;i<=b;i++)
double ans;
char s[1000001];
int n,k,a[1000001],sum;
using namespace std;
int main() {
    int i;
    scanf("%s",&s);
    n=strlen(s);
    scanf("%d",&k);
    rep(i,0,n-1) a[i+1]=s[i]-'0',sum+=a[i+1];
    double x=1.0;
    rep(i,1,k) x=x*(1.0-(n-1.0)*2.0/(n*(n-1.0)))+(1.0-x)*2.0/(n*(n-1.0));
    rep(i,1,n) ans+=((double)a[i]*x+(double)(sum-a[i])/(double)(n-1.0)*(1.0-x))*((double)i*(n-i+1.0)*2.0/(double)(n*(n+1.0)));
    printf("%.7lf",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值