zoukankan      html  css  js  c++  java
  • [期望] Jzoj P3459 TheSwaps

    Description

    Alice得到了一个整数, 她将其视作长度为n的字符串S。为了好玩,她进行了k次如下操作:

    1) 随机选取两个不同的位置x和y(即每次操作, {<x, y> | 1<=x < y <=n}中每个元素都有相同的概率被选到)

    2) 交换数位S[x]和数位S[y]

    为了自虐,在Alice恶搞之后,Bob会随机一个子串(即对于任意子串都有相同概率被选到),然后他想知道他选出的子串中各个位置数字之和的期望为多少。聪明的Bob想出了一个很好的方法来解决这个问题,那就是把这个问题交给你。Bob会告诉你S和k,你需要告诉他期望。
     

    Input

    一行,包含字S和k。

    Output

    一行,一个实数。当你的输出和标准答案的差距少于10^-6时,被认为是正确的。
     

    Sample Input

    输入1:
    477 1
    输入2:
    57268508514909598902647806463326698034850446919720257361969 7

    Sample Output

    输出1:
    10
    输出2:
    98.3238536775161
     

    Data Constraint

    对于70%的数据 |S|<=2500,k<=1000000

    对于100%的数据 |S|<=1000000,k<=1000000

    题解

    • k次交换后,ans=每一位的期望值*每一位被选出的概率
    • 显然第i位被选出的概率=包含i的子串数/总子串数=i*(n-i+1)/(n*(n+1)/2)
    • 那如何求k次交换后每一位的期望值?
    • 我们假设最初第i位为ai,p次交换后第i位仍然等于ai的概率是x,那么p+1交换后第i为仍然等于ai的概率是x*(1-(n-1)/q))+(1-x)/q
    • 其中q=n*(n-1)/2
    • 接下来有一个性质:
    • 如果第i位不为ai,那么第i位是a中其他任何数的概率都是一样的(交换的随机性决定的)
    • 因此如果k次交换后,第i位为ai的概率是x,那么第i位的期望值=ai*x+(sum-ai)/(n-1)*(1-x)
    • 以上是题解的说法

    代码

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <cstring>
     5 using namespace std;
     6 char s[1000010];
     7 int k,n,a[1000010],sum;
     8 double x,q,a1,a2,ans;
     9 int main()
    10 {
    11     scanf("%s %d",s,&k);
    12     n=strlen(s);
    13     for (int i=1;i<=n;i++)
    14     {
    15         a[i]=s[i-1]-'0';
    16         sum+=a[i];
    17     }
    18     x=1.0; q=(n-1.0)*n/2.0;
    19     for (int i=1;i<=k;i++) x=x*(1.0-(n-1.0)/q)+(1.0-x)/q;
    20     for (int i=1;i<=n;i++)
    21     {
    22         a1=i*(double)(n-i+1.0)/(double)(n*(n+1.0)/2.0);
    23         a2=(double)a[i]*x+(double)(sum-a[i])/(double)(n-1.0)*(1.0-x);
    24         ans+=a1*a2;
    25     }
    26     printf("%.9lf",ans);
    27     return 0;
    28 }
  • 相关阅读:
    DNS服务器原理简述、搭建主/从DNS服务器并实现智能解析
    JQuery02
    JQuery01
    python05
    python04
    python03
    Liunx命令
    Python运算符及注释
    python01
    原生JDBC+mybatis
  • 原文地址:https://www.cnblogs.com/Comfortable/p/9331122.html
Copyright © 2011-2022 走看看