众所周知,平面上的两个圆如果不相交且不相切(即分离),则它们有四条不同的公切线。
给定 $xy$ 平面上的四条直线。你的目标是对这些直线进行平行移动,使得它们成为某一对半径为正的分离圆的四条不同公切线。你希望以尽可能小的代价完成此操作,代价定义为移动距离之和。直线的移动距离是指移动前后两条直线之间的距离。
每条直线由两个参数 $a$ 和 $d$ 指定,定义为: $$x \cos\left(\frac{\pi a}{180}\right) + y \sin\left(\frac{\pi a}{180}\right) = d.$$
例如,$(a, d) = (60, 1)$ 的直线表示 $x/2 + \sqrt{3}y/2 = 1$,因为 $\cos(\pi/3) = 1/2$ 且 $\sin(\pi/3) = \sqrt{3}/2$。
首先,判断该目标是否可实现。如果可以,确定所需的最小代价,定义如下:满足目标可实现的最小代价 $c$,即对于任意正实数 $\varepsilon$,目标均可在代价至多为 $c + \varepsilon$ 的情况下实现。目标本身不需要在代价恰好等于 $c$ 时实现。
输入格式
输入包含一个或多个测试用例。输入的第一行包含一个整数 $t$ ($1 \le t \le 1000$),表示测试用例的数量。接下来是 $t$ 个测试用例的描述,每个测试用例格式如下:
$a_1 \ d_1$ $\vdots$ $a_4 \ d_4$
对于 $i = 1, \dots, 4$,两个整数 $a_i$ 和 $d_i$ 是指定第 $i$ 条直线的参数 ($0 \le a_i < 180$, $-1000 \le d_i \le 1000$)。在移动前,两条或多条直线可能相同。
输出格式
对于每个测试用例,如果目标不可实现,输出 no。否则,输出上述定义的最小代价。输出的绝对误差或相对误差必须小于或等于 $10^{-7}$。
样例
输入 1
4 90 0 90 0 45 0 135 0 0 -200 0 100 30 0 150 0 120 100 120 75 30 50 30 -100 178 -132 144 -83 165 199 19 31
输出 1
0 86.602540378444 no 173.814220263386
说明
在样例输入 1 的第一个测试用例中,你必须移动前两条相同直线中的至少一条(图 L.1 (a))。对于 $\varepsilon > 0$,将一条直线沿 $y$ 轴正方向移动 $\varepsilon/2$,另一条沿 $y$ 轴负方向移动 $\varepsilon/2$,即可以 $\varepsilon$ 的代价实现目标。这会产生半径为 $\varepsilon/2$ 的圆的四条切线(图 L.1 (b))。由于 $\varepsilon$ 可以任意小,因此最小代价为 0。其余情况如图 L.1 (c) 至 (e) 所示。
图 L.1. 样例输入 1 的说明