#include<stdio.h>
// #include<stdlib.h>
#include<math.h>

typedef struct{
  double x;
  double y;
}Point;

void kock(int, Point, Point);
Point getPoint(Point, Point, double);

int main(){
  int n;
  Point p1 = {0.0, 0.0};
  Point p2 = {100.0,  0.0};

  scanf("%d",&n);

  printf("%.8f %.8f\n", p1.x, p1.y);
  kock(n, p1, p2);
  printf("%.8f %.8f\n", p2.x, p2.y);

  return  0;
}

void kock(int n, Point p1, Point p2){
  Point s, t, u;
  double x_len = (p2.x - p1.x) / 3.0;
  double y_len = (p2.y - p1.y) / 3.0;
  double len = sqrt(pow(x_len,2) + pow(y_len,2));

  if(n == 0)
  return;

  s.x = p1.x + x_len;
  s.y = p1.y + y_len;
  t.x = p1.x + x_len * 2;
  t.y = p1.y + y_len * 2;
  u = getPoint(s, t, len);

  kock(n-1, p1, s);
  printf("%.8f %.8f\n", s.x, s.y);
  kock(n-1, s, u);
  printf("%.8f %.8f\n", u.x, u.y);
  kock(n-1, u, t);
  printf("%.8f %.8f\n", t.x, t.y);
  kock(n-1, t, p2);
}

Point getPoint(Point s, Point t, double len){
  Point u;

  if(s.x < t.x){
    if(s.y == t.y){
      u.x = s.x + (t.x - s.x)/2.0;
      u.y = s.y + sin(M_PI/3) * len;
    }
    else if(s.y < t.y){
      u.x = t.x -  len;
      u.y = t.y;
    }
    else if(s.y > t.y){
      u.x = s.x + len;
      u.y = s.y;
    }
  }
  else if(s.x > t.x){
    if(s.y == t.y){
      u.x = s.x - (t.x - s.x)/2.0;
      u.y = s.y - sin(M_PI/3) * len;
    }
    else if(s.y < t.y){
      u.x = s.x - len;
      u.y = s.y;
    }
    else if(s.y > t.y){
      u.x = t.x + len;
      u.y = t.y;
    }
  }

  return u;
}


