源程序      swap.cpp*
输入文件 swap.in
输出文件 swap.out
时间限制 1s
空间限制 256MB
【问题描述】
Alice 得到了一个整数, 她将其视作长度为 n 的字符串 S。为了好玩,她迚行了 k 次如下操作:
1) 随机选取两个不同的位置 x 和y(即每次操作, {<x, y> | 1<=x < y <=n}中每个元素都有
相同的概率被选到)
2) 交换数位 S[x]和数位 S[y]
为了自虐,在 Alice 恶搞之后,Bob 会随机一个子串(即对于任意子串都有相同概率被选到),然后
他想知道他选出的子串中各个位置数字之和的期望为多少。聪明的 Bob 想出了一个很好的方法来解决这个
问题,那就是把这个问题交给你。Bob 会告诉你 S和 k,你需要告诉他期望。
【输入格式】
一行,包含字 S和 k。
【输出格式】
一行,一个实数。当你的输出和标准答案的差距少于 10^-6 时,被认为是正确的。
【样例输入】
477 1
【样例输出】
10
【样例输入】
57268508514909598902647806463326698034850446919720257361969 7
【样例输出】
98.3238536775161
【数据范围】
对于 70%的数据 |S|<=2500,k<=1000000
对于 100%的数据 |S|<=1000000,k<=1000000

以下是题解部分。


首先,我们定义以下数组:

int a[]     //储存这个字符串
int f[] //任意字符在i轮交换之后不在自己原位上的概率
int total //结果
int sum //所有字符的权值和

【疑问环节】

Q:为什么$f$是“任意字符”的不在原位概率呢?为什么不是考虑每一个字符不在原位的概率呢?

A:因为对于每一个字符,它在交换i轮之后的概率都是相等的,所以我们可以把每一个字符每一轮的概率合并成任意字符每一轮的概率,即将二维转化为一维。

然后我们考虑$f$数组。对于第k轮交换,一个字符它只有两种可能:即上一轮在自己原位;与上一轮不在自己原位。那么,上一轮每个字符的位置情况决定了这一轮的概率。

上一轮不在自己原位的概率:

我们知道,每个字符串都可以和与自己不相同的字符串交换,所以交换的可能性为:$\frac{n(n-1)}{2}$。一个上一轮不在自己原位的字符回到自己原位的概率是$\frac{1}{\frac{n(n-1)}{2}}$,化简得$\frac{2}{n(n-1)}$。

所以,一个上一轮不在自己原位的字符在这一轮不回到自己原位的概率是:1-$\frac{2}{n(n-1)}$,化简得$\frac{n(n-1)-2}{n(n-1)}$。而上一轮不在自己原位的概率又是$f[k-1]$,可得递推式$f[k-1]×\frac{n(n-1)-2}{n(n-1)}$

上一轮在自己原位的概率:

如果一个字符上一轮在自己的位置,那么它在上上轮不在自己位置到了上轮在自己位置的概率为$1-f[k-1]$,而如果一个字符上一轮在自己位置上,那么这一轮它只需要和任意一个非自己位置的字符交换即可,有$\frac{n-1}{\frac{n(n-1)}{2}}$

即$\frac{1}{n/2}$种概率在这一轮不在自己位置。于是合并得:$(1-f[k-1])×\frac{1}{n/2}$。

最后,只需把两种概率相加,可得:

$$f[k]=f[k-1]×\frac{n(n-1)-2}{n(n-1)}+(1-f[k-1])×\frac{1}{n/2}$$

贡献值

求和:

$$(1-f[k])×a[i]×\frac{2i(n-i+1)}{(n+1)n}+f[k]×\frac{sum-a[i]}{n-1}×\frac{2i(n-i+1)}{(1+n)n}$$

The Swap的更多相关文章

  1. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  2. LVM 管理减少swap分区空间增加到根分区

    简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现 ...

  3. [LeetCode] Swap Nodes in Pairs 成对交换节点

    Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...

  4. 如何在Linux上使用文件作为内存交换区(Swap Area)

    交换区域(Swap Area)有什么作用? 交换分区是操作系统在内存不足(或内存较低)时的一种补充.通俗的说,如果说内存是汽油,内存条就相当于油箱,交换区域则相当于备用油箱. Ubuntu Linux ...

  5. XOR Swap

    swap(a, b): a ^= b b ^= a a ^= b 先明确一下,a ^ a = 0,同时对于一切数x ^ 0 = x 可以这样理解,第三行: b ^= a b ^= a ^ b b = ...

  6. 疑难问题解决备忘录(2)——ubuntu12.04分配swap

    分配swapdd if=/dev/zero of=Swap.disk bs=1M count=6k (count=1k创建1G的Swap,如果要创建6G则count=6k:这步比较慢) 创建swap文 ...

  7. Linux上的free命令详解、swap机制

    Linux上的free命令详解   解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free ...

  8. centos 创建swap 交换分区

    阿里云的服务器是没有交换分区的,如 [www-data@iZbp1ivdq1ie5lmrhp13kjZ ~]$ free -m total used free shared buff/cache av ...

  9. Swap Nodes in Pairs

    Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...

  10. CentOS7 SWAP 设置 (实测 笔记)

    首先查看当前的内存及swap情况(参数 -h,-m ) [root@centos ~]# free -h 查看swap信息,包括文件和分区的详细信息 [root@centos ~]# swapon - ...

随机推荐

  1. php 跨域问题 解决办法

    php 跨域问题的解决主要有两步: 本人使用的是  windows下的 phpstudy的集成环境 1.修改服务器配置文件 在 apache 的配置文件  D:\phpStudy\Apache\con ...

  2. Android 开发 记录一个DP、PX、SP转换工具类

    public class UnitConversionUtil { /** * 根据手机分辨率从DP转成PX * @param context * @param dpValue * @return * ...

  3. matlab-画个拱桥和倒影?

    matlab可用于各行各业的应用中,现在我们就简单画一个拱桥试一试. r=input('请输入半径: '); z=input('请输入弧度: '); figure() %r=4; %画拱洞,用李萨如图 ...

  4. Hive 特殊日期获取 tips

    获取当前日期 SELECT CURRENT_DATE, CURRENT_TIMESTAMP, from_unixtime(unix_timestamp()); 上个月1号 concat(substr( ...

  5. 使用idea建立逆向工程

    逆向工程(Mybatis Generator) 概念 mybatis Generator 中文官网 mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表 自动生成m ...

  6. visual studio split edit window 编辑器窗口分屏

    OR

  7. Git综合使用命令行和gui工具小结

    使用Git的时候,综合使用命令行和gui工具,可以把Git用的最舒服,因此这里总结下使用gui和命令行的一些对应操作, gui中拉取:git pull origin dev_branch gui中推送 ...

  8. python实战:用70行代码写了一个山炮计算器!

    python实战训练:用70行代码写了个山炮计算器! 好了...好了...各位因为我是三年级而发牢骚的各位伙伴们,我第一次为大家插播了python的基础实战训练.这个,我是想给,那些python基础一 ...

  9. Tinker热修复

    集成buggly热修复的时候报错 Error:A problem occurred configuring project ‘:app’. Failed to notify project evalu ...

  10. ES中的分词器

    基本概念: 全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器), 这些Token会被进一步处理, 比如转成小写等, 这 ...