有一个关于在平面上寻找点集中距离最近的两个点的经典问题。解决该问题有一个经典的随机算法,过程如下:
将平面绕原点旋转一个随机角度 $\text{phi}$ 令 $p$ 为点数组 将 $p$ 按 $x$ 坐标升序排序 $ans = \text{INF};$ for (int i = 0; i < n; i++) { for (int j = i - 1; j >= 0; j--) { if (p[i].x - p[j].x >= ans) break; ans = min(ans, dist(p[i], p[j])); } }
这里的 “INF” 是一个大于所有距离的数。函数 “dist” 返回给定两点之间的欧几里得距离。注意,旋转后所有点的 $x$ 坐标以概率 1 互不相同。
我知道这个算法在实践中表现良好,但究竟有多好呢?我要求你计算函数 “dist” 被调用的期望次数,假设角度 “phi” 是从区间 $[0; 2 \cdot \pi)$ 中均匀随机选择的。
输入格式
第一行包含一个整数 $n$ ($2 \le n \le 250$),表示点的数量。 接下来的 $n$ 行,每行包含一个点的坐标。 所有坐标的绝对值均不超过 $10^6$。 保证所有点互不相同。保证没有三点共线。
输出格式
输出一个数字 —— 函数 “dist” 被调用的期望次数。 如果你的答案的绝对误差或相对误差不超过 $10^{-6}$,则被视为正确。 形式化地,设你的答案为 $a$,标准答案为 $b$,若满足 $\frac{|a-b|}{\max(1, |b|)} \le 10^{-6}$,则你的答案被接受。
样例
样例输入 1
4 0 0 0 1 1 0 1 1
样例输出 1
5.0000000000000
样例输入 2
3 0 0 0 1 1 0
样例输出 2
2.5000000000000