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

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

void kock(double n,Point p1,Point p2)//p1 と　p2の間に点を打つ p1^s^u^t^p2
{
  Point s,t,u;
 
  if (n == 0)return;//100回点を打ったら終わり
  // p1, p2 から s, t, u を計算
  s.x=(2*p1.x + p2.x) / 3;
  s.y=(2*p1.y + p2.y) / 3;
  
  t.x=(p1.x + 2 * p2.x) / 3;
  t.y=(p1.y + 2 * p2.y) / 3;

  u.x=(t.x - s.x) * cos(M_PI/3) - (t.y - s.y) * sin(M_PI / 3) + s.x;
  u.y=(t.x - s.x) * sin(M_PI/3) + (t.y - s.y) * cos(M_PI / 3) + s.y;
 
  kock(n-1, p1, s);//p1^s
  printf ("%.8f %.8f\n",s.x,s.y);
  
  kock(n-1, s, u);//s^u
  printf ("%.8f %.8f\n",u.x,u.y);
  
  kock(n-1, u, t);//u^t
  printf ("%.8f %.8f\n",t.x,t.y);
  
  kock(n-1, t, p2);//t^p2clear
}



int main()
{
  int n;
  Point p1={0,0};//スタート
  Point p2={100,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;
}


