include Math
N = gets.to_i

class Point
  attr_accessor :x, :y
  def initialize(x, y)
    @x = x
    @y = y
  end
end

a = Point.new(0, 0)
b = Point.new(100, 0)

def koch(n, a, b)
  # 線分の右端の座標を返す
  return b if n == 0

  # 現在の線分に対して3頂点を計算する
  s = trisection_left(a, b)
  t = trisection_right(a, b)
  u = trisection_top(s, t)

  # 3頂点で分かれた4本の線分の左から順に再帰呼び出しを実行
  koch(n-1, a, s)
  # もし、nが0に到達したら、右端の座標が返されるので、それを表示する
  puts "%.8f %.8f" %[s.x, s.y]
  koch(n-1, s, u)
  puts "%.8f %.8f" %[u.x, u.y]
  koch(n-1, u, t)
  puts "%.8f %.8f" %[t.x, t.y]
  koch(n-1, t, b)
  #結果、(0,0),(100,0)を除く、頂点の座標が左から順に出力される
end

def trisection_left(a, b)
  new_x = (2 * a.x + b.x ) / 3.to_f
  new_y = (2 * a.y + b.y ) / 3.to_f
  Point.new(new_x, new_y)
end

def trisection_right(a, b)
  new_x = (a.x + 2 * b.x) / 3.to_f
  new_y = (a.y + 2 * b.y) / 3.to_f
  Point.new(new_x, new_y)
end

def trisection_top(s, t)
  new_x = (t.x - s.x) * cos(PI/3) - (t.y - s.y) * sin(PI/3) + s.x
  new_y = (t.x - s.x) * sin(PI/3) + (t.y - s.y) * cos(PI/3) + s.y
  Point.new(new_x, new_y)
end

puts "%.8f %.8f" %[a.x, a.y]
koch(N, a, b)
puts "%.8f %.8f" %[b.x, b.y]

