#P17573. PM4452 圆盘覆盖

PM4452 圆盘覆盖

题目描述

给定一个半径为 discRadius 的圆盘,希望用 numDiscs 个半径相同的小圆盘完全覆盖它。所有小圆盘都与原圆盘处于同一平面。

覆盖方式必须遵循下面的规则。

首先,用若干个与原圆盘同心的圆把原圆盘划分成若干个环形区域。最内层区域可以看作内半径为 00 的“环”。随后,每个环单独用若干个小圆盘覆盖:负责同一个环的所有小圆盘,其圆心到原圆盘圆心的距离都相同,并且这些圆心均匀分布在该同心圆上,也就是构成一个正多边形。

你可以自行决定:

  • 把原圆盘分成多少个环;
  • 每个环使用多少个小圆盘;
  • 每个环对应的小圆盘圆心到原圆心的距离。

所有环使用的小圆盘总数必须恰好为 numDiscs。需要选择这些参数,使得在上述覆盖方式下,小圆盘所需的公共半径尽可能小。

请输出这个最小半径。

覆盖某一个环时,即使该环的一部分已经被其他环所使用的小圆盘覆盖,也仍然忽略这些额外覆盖,只考虑分配给当前环的小圆盘能否独立覆盖整个环。

最内层“环”是一个圆盘,即其内半径为 00。也允许总共只有一个环。

输入格式

输入一行,一个实数 discRadius 和一个整数 numDiscs

输出格式

输出一个实数,表示所需小圆盘半径的最小值。

当你的答案与标准答案的绝对误差或相对误差小于 10910^{-9} 时视为正确。

样例 1

输入

1000.0 1

输出

1000.0

样例 2

输入

500.0 2

输出

500.0

样例 3

输入

100.0 3

输出

86.60254037844385

三个小圆盘的圆心可以构成等边三角形。若小圆盘半径为 rr,最多可覆盖半径为 2r/32r/\sqrt3 的圆盘,因此答案为 discRadius3/2\cdot\sqrt3/2

样例 4

输入

100.0 4

输出

70.71067811865474

样例 5

输入

200.0 19

输出

59.085199376486976

下面两幅图分别展示了使用 1919 个小圆盘时的一种最优覆盖方式,以及另一种非最优覆盖方式。

数据范围

  • 1.0discRadius1000.01.0\le\text{discRadius}\le1000.0
  • 1numDiscs20001\le\text{numDiscs}\le2000