東京大学プログラミングコンテスト2012

K - ラッピング


Time limit時間制限 : 2sec / Memory limitメモリ制限 : 256MB

問題

X 君はおもちゃ屋でおもちゃにラッピングをする仕事をしており, クリスマスを前にこの時期は大忙しである (クリスマスには少々早いように思われるが, 日本のクリスマスはハロウィンが終わったその瞬間から始まるのだ).

今回 X 君は, 一辺が 1 メートルもある巨大な立方体の箱にリボンを巻くことになった. リボンは箱の表面に沿って巻き, 最終的に端と端を結んで輪にする. リボンの巻き方は決まっており, 立方体をxyz空間内に各辺が座標軸と平行になるように置いた場合に, 上面でリボンがベクトル(a,b,0)と平行な部分ができるように巻かなければならない. リボンはぴんと張った状態で巻くことになるため, 箱の面の上ではまっすぐになり, 辺を横切るときには下図の2箇所の角度は等しくなる.

もちろん, リボンが箱の角を通るようなことがあってはならない. そんなことをしたらリボンが傷んでしまう!!

上の条件をみたすようにリボンを巻くとき, 必要なリボンの長さの最小値を出力せよ. ただし, X 君はリボンを結ぶのがめちゃくちゃうまいので, 結び目の長さは考えなくて良いが, 結び目の箇所においてもリボンはぴんと張った状態になっていなければならない.


入力

a b

1行にリボンの方向 (a, b) が与えられる.

出力

必要なリボンの長さを1行で出力せよ.

制約

部分点

この問題の判定には,50 点分のテストケースのグループが設定されている. このグループに含まれるテストケースの入力は追加で以下の条件を満たす.


入力例 1

1 1

入力例 1 に対する出力例

4.2426406871192851464050661726291

たとえば下図のようにリボンを巻くのが最善である:


入力例 2

1 0

入力例 2 に対する出力例

4

たとえば下図のようにリボンを巻くのが最善である:


入力例 3

10 30

入力例 3 に対する出力例

9.4868329805051379959966806332982

たとえば下図のようにリボンを巻くのが最善である:

たとえば下図のような巻き方は許されないことに注意せよ (黒丸は結び目):


Submit提出する