class Point
	@@RAD60 = Math::PI * 60.0 / 180.0

	attr_accessor :x, :y

	def initialize(x, y)
		@x, @y = x, y
	end

	def to_s
		sprintf("%.8f %.8f", @x, @y)
	end

	def self.trisection(p1, p2)
		x1 = (2 * p1.x + p2.x) / 3
		y1 = (2 * p1.y + p2.y) / 3
		x2 = (p1.x + 2 * p2.x) / 3
		y2 = (p1.y + 2 * p2.y) / 3
		return Point.new(x1, y1), Point.new(x2, y2)
	end

	def self.triangle_vertex(p1, p2)
		x = (p2.x - p1.x) * Math.cos(@@RAD60) - (p2.y - p1.y) * Math.sin(@@RAD60) + p1.x
		y = (p2.x - p1.x) * Math.sin(@@RAD60) + (p2.y - p1.y) * Math.cos(@@RAD60) + p1.y
		Point.new(x, y)
	end

	def self.print_koch_curve(start_point, end_point, depth)
		print_koch_curve_base(start_point, end_point, depth)
		puts end_point
	end

	private
	def self.print_koch_curve_base(start_point, end_point, depth)
		if depth == 0
			puts start_point
			return
		end

		p1, p2 = trisection(start_point, end_point)
		p3 = triangle_vertex(p1, p2)

		print_koch_curve_base(start_point, p1, depth - 1)
		print_koch_curve_base(p1, p3, depth - 1)
		print_koch_curve_base(p3, p2, depth - 1)
		print_koch_curve_base(p2, end_point, depth - 1)
	end

end

start_point = Point.new(0.0, 0.0)
end_point   = Point.new(100.0, 0.0)
depth = STDIN.gets.to_i
Point.print_koch_curve(start_point, end_point, depth)