luogu#P7996. [WFOI - 01] 硬币(coin)

    ID: 11992 远端评测题 1000ms 512MiB 尝试: 0 已通过: 0 难度: 3 上传者: 标签>数学二分洛谷原创O2优化洛谷月赛

[WFOI - 01] 硬币(coin)

题目描述

你面前有一排 nn 硬币排成一线,同一堆硬币的面值相同,记第 ii 堆硬币的面值为 aia_i。而每堆硬币的数量都相同,记为 xx

现在你知道每第 ii 堆硬币的面值 aia_i,你需要确定一个正整数 xx,使得每堆硬币的总金额的方差最接近于一个正整数 kk

两数 “最接近” 的定义:两数之差的绝对值最小。

方差定义:方差 $s ^ 2 = \cfrac{(a_1 - \bar x)^2 + (a_2 - \bar x) ^ 2 + \cdots + (a_n - \bar x) ^ 2}{n}$,其中 xˉ\bar x 代表 xx 的平均值。

输入格式

第一行两个数 n,kn,k

第二行 nn 个数,第 ii 个数表示 aia_i,表示第 ii 堆硬币的面值 aia_i

输出格式

一行一个正整数,表示符合题意的 xx 值。如果有不同的答案,输出最小的一个。如果无论 xx 取什么值方差都为 00,输出一行 No answer!

7 47
7 2 4 6 3 7 10
3
4 4
4 4 4 4
No answer!

提示

【样例 #1\#1 解释】

x=3x=3 时,第 ii 个堆的硬币金额为 3×ai3\times a_i,这些硬币堆的金额分别为 21,6,12,18,9,21,3021,6,12,18,9,21,30,可以计算得这些硬币金额的方差约为 58.7858.78,可以证明当 x=3x=3 时方差最接近 4747

【样例 #2\#2 解释】

可以发现,无论 xx 的取值,方差都会为 00,所以输出 No answer!

【数据规模】

本题采用 Subtask 捆绑测试。

Subtask 编号 n,ain,\forall a_i\le kk\le 测试点数目\footnotesize\texttt{测试点数目}
Subtask #0 (20pts)(20\texttt{pts}) 10310^3 10910^9 66
Subtask #1 (25pts)(25\texttt{pts}) 10510^5 101210^{12}
Subtask #2 (25pts)(25\texttt{pts}) 101810^{18}
Subtask #3 (30pts)(30\texttt{pts}) 7×1067\times10^6 3×10183\times 10^{18}

对于 100%100\% 的数据,1n,ai7×1061\le n,\forall a_i\le7\times10^61k3×10181\le k\le3\times10^{18}。记原来 aa 数组的方差为 pp,则数据满足 p=0p=0p[0.25, 2631]p\in[0.25,\ 2^{63}-1]

【提示】

本题读入量较大,请使用合适的读入方式。此处推荐快速读入模板,对于 C/C++\texttt{C/C++} 语言,你也可以使用 scanf 语句完成读入。

为避免卡精度,建议 C/C++ 选手使用 double\texttt{double} 类型,并不建议使用 eps