• 【NOIP2013模拟9.29】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*(l-i+1)/(l*(l+1)/2)。
    那如何求k次交换后每一位的期望值?
    我们假设最初第i位为ai,p次交换后第i位仍然等于ai的概率是x,那么p+1交换后第i为仍然等于ai的概率是x*(1-(l-1)/y))+(1-x)/y,其中y=l*(l-1)/2。
    接下来有一个性质:
    如果第i位不为ai,那么第i位是a中其他任何数的概率都是一样的(交换的随机性决定的)。
    因此如果k次交换后,第i位为ai的概率是x,那么第i位的期望值=ai*x+(tj-ai)/(l-1)*(1-x)。
    至此问题就可以解决了。
    .
    .
    .
    .
    .

    程序:
    #include<iostream>
    #include<string.h>
    #include<cstdio>
    using namespace std;
    double x,y,rp,u,v;
    int a[1000001],tj,l,k;
    char zf[1000001];
    
    void jb()
    {
        cin>>zf;
        cin>>k;
        l=strlen(zf);
        x=1.0;
        y=l*(l-1.0)/2.0;
        for (int i=1;i<=k;i++) 
        x=x*(1.0-(l-1.0)/y)+(1.0-x)/y;
        for (int i=1;i<=l;i++)
        {
            a[i]=zf[i-1]-'0';
            tj+=a[i];
        }
    }
    
    int main()
    {
        jb();
        for (int i=1;i<=l;i++)
        {
            u=i*(double)(l-i+1.0)/(double)(l*(l+1.0)/2.0);
            v=(double)a[i]*x+(double)(tj-a[i])/(double)(l-1.0)*(1.0-x);
            rp+=u*v;
        }
        printf("%.9lf",rp);
        return 0;
    }
  • 相关阅读:
    MySql常用数据操作
    使用requests+BeaBeautiful Soup爬取妹子图图片
    抓取猫眼电影排行
    Exec执行拼接字符串时遇到的问题及Sql执行函数时需要注意的事项
    c#小知识点
    MVVM 与 sql
    Dictionary
    sql表信息查询
    XAML特殊字符
    编程细节
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9499919.html
Copyright © 2020-2023  润新知