The Swap
源程序 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的更多相关文章
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- LVM 管理减少swap分区空间增加到根分区
简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现 ...
- [LeetCode] Swap Nodes in Pairs 成对交换节点
Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...
- 如何在Linux上使用文件作为内存交换区(Swap Area)
交换区域(Swap Area)有什么作用? 交换分区是操作系统在内存不足(或内存较低)时的一种补充.通俗的说,如果说内存是汽油,内存条就相当于油箱,交换区域则相当于备用油箱. Ubuntu Linux ...
- XOR Swap
swap(a, b): a ^= b b ^= a a ^= b 先明确一下,a ^ a = 0,同时对于一切数x ^ 0 = x 可以这样理解,第三行: b ^= a b ^= a ^ b b = ...
- 疑难问题解决备忘录(2)——ubuntu12.04分配swap
分配swapdd if=/dev/zero of=Swap.disk bs=1M count=6k (count=1k创建1G的Swap,如果要创建6G则count=6k:这步比较慢) 创建swap文 ...
- Linux上的free命令详解、swap机制
Linux上的free命令详解 解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free ...
- centos 创建swap 交换分区
阿里云的服务器是没有交换分区的,如 [www-data@iZbp1ivdq1ie5lmrhp13kjZ ~]$ free -m total used free shared buff/cache av ...
- Swap Nodes in Pairs
Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...
- CentOS7 SWAP 设置 (实测 笔记)
首先查看当前的内存及swap情况(参数 -h,-m ) [root@centos ~]# free -h 查看swap信息,包括文件和分区的详细信息 [root@centos ~]# swapon - ...
随机推荐
- python 中list的深拷贝和浅拷贝
注意:这里提到是list的隐式转换例如 a=[1,2,3]def test(n):n[2] = n[2]*2c=a此时是浅拷贝,当调用test(c)时,可以看到a也发生了变化c=[1,4,3]a=[1 ...
- js长整型的失真问题解决
遇到的问题: 后端返回的订单号是整型的,超过了Math.pow(2,53) = 9007199254740992,导致获取的数据失真. 类似问题:https://www.zhihu.com/quest ...
- 【C语言基础】什么是数据类型?
基本数据类型 整数 整型 — — int ---- 4 字节 短整型 — — short int ---- 2 字节 长整型 — — long int ---- 8 字节 ...
- 转载:深入浅出Zookeeper(一) Zookeeper架构及FastLeaderElection机制
转载至 http://www.jasongj.com/zookeeper/fastleaderelection/: 原创文章,转载请务必将下面这段话置于文章开头处.本文转发自技术世界,原文链接 htt ...
- mysql创建用户并分配权限
添加新用户 允许本地 IP 访问 localhost, 127.0.0.1 create user 'test'@'localhost' identified by '123456'; 允许外网 IP ...
- 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象
一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE? Java技术体系包括: · Java程序设计语言: · 各种硬件平台上的 ...
- GDI+_从Bitmap里得到的Color数组值分解
[这里写只是我个人的摸索经历,已经给出解决方案] 我之前写过一篇关于ARGB值的研究:https://www.cnblogs.com/lingqingxue/p/10362639.html 最近我又遇 ...
- 使用hexo在GitHub上无法上传博客
原以为是秘钥或者其他错误,后来发现是邮箱设置的问题 在GitHub的你账号网页上右上角,个人的登录退出的位置,找到setting: setting->emails->Keep my ema ...
- [Ting's笔记Day9]活用套件Carrierwave gem:(4)使用Imagemagick修改图片大小
前情提要: 这几天我都在实验Carrierwave这套图片上传套件,也顺利部署到Heroku架站正式环境了.:) 接下来我遇到了新的问题:要如何在上传的时候,让Carrierwave gem大型siz ...
- hdu2586How far away ?-(LCA)
http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:有n个点,有n-1条线连通,求两点间的最短距离,最近公共祖先的入门题.Tarjan离线算法. #in ...