源程序      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. CentOS 7 升级 Linux 内核

    一.升级内核 1.更新仓库 yum -y update 2.用 ELRepo 仓库 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org ...

  2. rest_framework目录

    一  REST API规范 二  rest framework框架的基本使用

  3. Python多线程实例

    前言 感觉理解python多线程用“切换”和“共享”就差不多了.这里就贴上一个抢车票的小小实例,还有自己在编程过程中遇到的坑..... 实例:抢车票 抢车票有三类人:会员.弄了加速包.普通人. 说说区 ...

  4. Android 开发 上拉加载更多功能实现

    实现思维 开始之前先废话几句,Android系统没有提供上拉加载的控件,只提供了下拉刷新的SwipeRefreshLayout控件.这个控件我们就不废话,无法实现上拉刷新的功能.现在我们说说上拉加载更 ...

  5. 【学习】如何安装GraphLab Create 【转载】

    前人走过的路不用再走,慢慢加上一些工具的链接 GraphLab Create安装,链接地址: http://www.imooc.com/article/18094?block_id=tuijian_w ...

  6. LeetCode 24. Swap Nodes in Pairs 成对交换节点 C++/Java

    Given a linked list, swap every two adjacent nodes and return its head. You may not modify the value ...

  7. Python第5天

    今日学习的主要内容: 数据类型和变量的总结:(可变:列表,字典)(不可变:字符串,数字,元组) 引出集合概念:不同元素,无序,不可变类型 set方法—>集合 add添加:clear清空:pop删 ...

  8. Java 8 Optional 类

    转自:https://www.runoob.com/java/java8-optional-class.html Optional 类是一个可以为null的容器对象.如果值存在则isPresent() ...

  9. TinkPHP框架学习-03模型类

    1-----数据访问 2-----数据查询 3-----数据添加 4-----数据修改 5-----数据删除 创建一张nation表并写入三条测试数据 create table nation( `co ...

  10. 微信小程序代码大全 - 小程序开发福利

    小程序QQ交流群:131894955 小程序开发文档(Wepy) 小程序商城源码下载(weixin-app-shop) 小程序官网源码下载(weixin-app-cms) 微信管家平台JAVA版开源下 ...