随机数生成器
题号:NC231632
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
Special Judge, 64bit IO Format: %lld

题目描述

有一种随机数生成器工作原理如下:

它存储了若干个数据:一个大于 1 的整数 n,一个正整数 t ,以及 n 个整数构成的数组 ,保证

每次生成随机数时候,它先随机生成两个不相等的整数 ,随后返回 作为结果。

出于某种原因,你想让生成的随机数的期望值尽量大。经过一番友好交流,生成器的所有者允许你对内部数据进行若干次修改。

每次修改你可以任意指定 ,并翻转 a_x 的二进制表示中第 y 位。不过,你需要保证总修改次数不超过 p 次,且数组中任意 a_i 被修改不超过 q 次。

你想知道基于上述规则进行修改后,生成的随机数的期望值最大可以达到多少,输出这个最大值。

输入描述:

第一行输入四个整数 n, t, p, q,保证 

第二行输入 n 个整数 ,保证

输出描述:

输出一个浮点数,表示最大期望。要求相对误差小于 
示例1

输入

复制
2 2 0 0
1 1

输出

复制
0.0000000000

说明

你没有机会进行任何修改,期望为 |1 - 1| = 0
示例2

输入

复制
3 2 2 1
0 1 2

输出

复制
2.0000000000

说明

一种可行的方案是 a_2 修改一次变成 3,随后 a_3 修改一次变成 3
示例3

输入

复制
10 10 14 5
137 342 507 383 64 445 966 115 647 56

输出

复制
561.1111111111