Problem:
Problem F: Strawberry Cake

会津大学附属小学校 (会津大小) に入学したシャ、ネロ、エリ、コーは競技プログラマとして活躍するために IPPC というプログラミングコンテストに出場することにした。しかし IPPC は 3 人 1 組でチームとしてコンテストに出場する決まりで、4 人でチームを組むことはできない。そこで彼らは 2 人ずつに分かれてチームを組み、2 人 1 組で参加できる IPOCH というプログラミングコンテストに出場することにした。

チームは分かれてしまったが、実力は拮抗しており互いに良い練習相手になっている。

ある日彼らのコーチが差し入れにホールケーキを買ってきた。彼らはそれをシャの家で食べることにした。しかし家に着いて箱を開けてみるとケーキが変形していて、形は上から見ると円形ではなく凸多角形のようになっていた。ネロに運ばせたのが悪かったようだ。
ケーキの上にはイチゴが 1 つ乗っている。とりあえず 2 チームで分けるために、いまこのケーキをイチゴを通る直線にそって半分になるようにナイフで切ることが決定した。ケーキを切る前にイチゴを先にとってしまうのは彼らの美意識に反する。

あなたの仕事は 2 次元平面上に与えられる凸多角形 K を原点 (0, 0) を通る直線 L で分割したとき、分割で出来た 2 つの凸多角形の面積が等しくなるように直線 L を定めることである。もし複数あるならいずれかひとつで構わない。

Input

入力は複数のテストケースからなる。各テストケースは以下の形式に従う。

N
x1 y1
x2 y2
...
xN yN

N は与えられる凸多角形 K の頂点数である。点 (xi, yi) ( 1 ≤ i ≤ N ) はすべて凸多角形 K を成す頂点の座標であり、互いに異なる。これらは反時計回りの順で与えられる。また、凸多角形 K のどの辺上の点も原点との距離が 1 以上で、凸多角形 K は常に原点を内包する。入力の終了はひとつの0を含む１行で示される。原点を含む、入力で与えられる異なる 3 点は共線となりうることに注意して欲しい。

Constraints

入力はすべて整数

3 ≤ N ≤ 20

-100 ≤ xi ≤ 100 ( 1 ≤ i ≤ N )

-100 ≤ yi ≤ 100 ( 1 ≤ i ≤ N )

テストケースの数は 1,000 を超えない。

Output

以下の形式で直線 L 上の点 A (Ax, Ay) を出力せよ。ただし点 A と原点との距離は 1 以上でなければならない。

Ax Ay

原点とこの点 A を通る直線で凸多角形 K を分割したとき 2 つの凸多角形の面積の差が 10-5 未満でなければならない。点 A の座標は小数点以下 15 桁出力して欲しい。

Sample Input

4
-100 -100
100 -100
100 100
-100 100
4
-99 -100
100 -100
100 100
-99 100
4
-100 -99
100 -99
100 100
-100 100
14
-99 -70
-92 -79
10 -98
37 -100
62 -95
77 -69
88 -47
92 -10
96 28
100 91
42 92
-62 92
-88 91
-98 64
0

Sample Output

100.000000000000000 0.000000000000000
100.000000000000000 0.000000000000000
0.000000000000000 100.000000000000000
-96.983291994836122 66.745111613942484

Solution in Ruby (judge verdict: Wrong Answer)

### constant

PI2 = Math::PI * 2

DELTA = 1.0e-16
N_DIV = 100
DIVPI = Math::PI / N_DIV

### classes

class ConvexPolygon
  def initialize(pts)
    npts = pts.length

    ths = []
    for pt in pts
      thi = Math.atan2(pt[1], pt[0])
      thi += PI2 if thi < 0.0
      ths << thi
    end

    @area = 0.0
    @lines = []

    for i in (0...npts)
      j = (i + 1) % npts

      pix, piy = pts[i]
      pjx, pjy = pts[j]
      vx = pjx - pix
      vy = pjy - piy
      thi = ths[i]
      thj = ths[j]
      ar = _tarea(pix, piy, pjx, pjy)
      @area += ar

      if thi <= thj
        @lines << [thi, thj, vx, vy, pix, piy, ar]
      else
        ti = _cross_line(vx, vy, pix, piy, 0.0)
        p0x = vx * ti + pix
        p0y = vy * ti + piy
        @lines << [thi, PI2, p0x - pix, p0y - piy, pix, piy, ar * ti]
        if ti < 1.0
          @lines << [0.0, thj, pjx - p0x, pjy - p0y, p0x, p0y, ar * (1.0 - ti)]
        end
      end
    end

    @lines.sort!
    @n = @lines.length
  end

  def cut(th0)	# 0.0 <= th0 < PI
    th1 = th0 + Math::PI
    harea = 0.0

    for k in (0...@n)
      thi, thj, vx, vy, px, py, ar = @lines[k]
      next if thj < th0

      if thi <= th0 && th0 <= thj
        ti = _cross_line(vx, vy, px, py, th0)
        harea += ar * (1.0 - ti)
      elsif th0 <= thi && thj <= th1
        harea += ar
      elsif thi <= th1 && th1 <= thj
        ti = _cross_line(vx, vy, px, py, th1)
        harea += ar * ti
        break
      end
    end
    harea / @area
  end

  def cross_pt(th)
    for line in @lines
      if line[0] <= th && th <= line[1]
        ti = _cross_line(*line[2, 4], th)
        px = line[2] * ti + line[4]
        py = line[3] * ti + line[5]
        return [px, py]
      end
    end
    nil
  end

  def _tarea(p0x, p0y, p1x, p1y)
    (p0x * p1y - p0y * p1x).abs / 2
  end

  def _cross_line(v0x, v0y, p0x, p0y, th)
    v1x = Math.cos(th)
    v1y = Math.sin(th)

    d = v0x * v1y - v0y * v1x
    return nil if d == 0.0

    sd = -v0y * p0x + v0x * p0y
    td = -v1y * p0x + v1x * p0y
    #[s * v1x, s * v1y]
    #(t >= 0.0 && t <= 1.0) ? s : nil
    #[sd / d, td / d]
    td / d
  end
end

### main

dths = (0..N_DIV).map{|i| DIVPI * i}

loop do
  n = gets.to_i
  break if n == 0

  pts = n.times.map{gets.split.map(&:to_f)}
  cp = ConvexPolygon.new(pts)
  #p cp
  #p cp.cut(0.0)

  cuts = dths.map{|th| cp.cut(th) - 0.5}
  th = nil

  for i in (0...N_DIV)
    th0 = dths[i]
    cut0 = cuts[i]
    if cut0.abs < DELTA
      th = th0
      break
    end

    th1 = dths[i + 1]
    cut1 = cuts[i + 1]
    if cut1.abs < DELTA
      th = th1
      break
    end

    next if cut0 * cut1 > 0.0

    while th1 - th0 > DELTA
      th2 = (th0 + th1) / 2
      cut2 = cp.cut(th2) - 0.5
      if cut2.abs < DELTA
        th0 = th1 = th2
        break
      end

      if cut0 * cut2 > 0.0
        th0 = th2
      else
        th1 = th2
      end
    end

    th = th2
    break
  end

  cpt = cp.cross_pt(th)
  printf("%.15f %.15f\n", *cpt)
end