このテク使うのまだ2回目…。
https://yukicoder.me/problems/no/724
問題
整数n,a,bが与えられる。a<bである。
2次元座標で(a,0)を中心とする半径aの円と(b,0)を中心とする半径bの円を考える。
前者に外接し、後者に内接する円を、互いに重ならないようにn個配置する。
n個の半径の最小値を最大化せよ。
解法
Editorialに反転幾何による式が書いてあるので、それを導いてみる。
2つの円を原点に対し反転するとY軸に平行な2つの直線とになる。
ここで両者の間に、X軸に近い位置にn個円を配置することを考える。
各円のX座標はであり、半径はいずれもとなる。
もっともY座標が大きい位置の円の中心のY座標はとなる。
この円について、最も原点に近い位置までの距離はであり遠い点までの距離はとなる。
よってこの2点を再度反転させると、両者の距離の半分が元図形における円の半径となるので、求める解はである。
X,Y,Rは上に書いた通りで、これを整理するとEditorialにあるが得られる。
void solve() { double N,A,B; cin>>N>>A>>B; _P("%.12lf\n",4*A*B*(B-A)/((N*N-2*N)*(B-A)*(B-A)+(A+B)*(A+B))); }
まとめ
反転幾何使うの、KUPC2016の最終問以来な気がする。
百目おばけ(解説PDF)