#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
//最大输入数为 8
#define ROW 128//定义计算数组行数
#define COL 130//定义计算数组列数

//定义输出数组行列
#define ROWS 384
#define COLS 767

//初始化计算数组
void Setcal(short arr[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j <= i + 2; j++)
		{
			arr[i][j] = 1;
		}
	}
}

//初始化输出数组
void Setshow(char arr[ROWS][COLS], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

//计算过程(默认第一行除了中间的一个-1其他都为1)
//计算原理:
//.. 1   1   -1   1   1 ...
//    \ /  \  / \  / \ /   相乘
//   ..1   -1   -1   1..
// \  / \  / \  / \  / \ / 
//..1   -1    1   -1   1...
//1  -1   -1   -1   -1   1
//  ......
//共3 * 2^(N-1)行
//每一个-1对应一个基础三角
//即: *
//      * *
//     * * *
//即为预期输出图形
void Calculate(short arr[ROW][COL], int row, int col)
{
	arr[0][1] = -1;
	for (int i = 1; i < row; i++)
	{
		for (int j = 1; j <= i + 1; j++)
		{
			arr[i][j] = arr[i - 1][j - 1] * arr[i - 1][j];
		}
	}
}

//根据计算数组所得结果更改输出数组
void Change(char arr2[ROWS][COLS], short arr1[ROW][COL], double row, double col, double n)
{
	for (int i = 0; i < (int)row; i++)
	{
		for (int j = 1; j < (int)col; j++)
		{
			if (arr1[i][j] == -1)
			{
				//将计算数组算出的值为-1的点对应到输出数组中每一个基础三角形的顶点
				int i1 = 3*i;
				int j1 = 6 * (j - 1) + 3 * pow(2, n - 1) - 1 - 3 * i;
				//从顶点开始将基础三角形元素换成 '*' 符号
				arr2[i1][j1] = '*',
					arr2[i1 + 1][j1 - 1] = '*', arr2[i1 + 1][j1 + 1] = '*',
					arr2[i1 + 2][j1 - 2] = '*', arr2[i1 + 2][j1] = '*', arr2[i1 + 2][j1 + 2] = '*';
			}
		}
	}
}

//打印输出数组
void Display(char arr[ROWS][COLS], double row, double col)
{
	for (int i = 0; i <= (int)row; i++)
	{
		for (int j = 0; j <= (int)col; j++)
		{
			printf("%c", arr[i][j]);
		}
		printf("\n");
	}
}

//主函数
int main()
{
	double N = 0;
	while(~scanf("%lf",&N))
	{
		//创建底层计算数组
		short cal[ROW][COL] = { 0 };
		//创建输出数组
		char show[ROWS][COLS] = { '0' };
		//初始化底层计算数组,将数组元素全部设置为 1
		Setcal(cal, ROW, COL);
		//初始化输出数组,将其全部元素设置为' '
		Setshow(show, ROWS, COLS);
		//定位算法
		Calculate(cal, pow(2, N - 1), COL);
		//根据计算结果更改输出数组元素
		Change(show, cal, pow(2, N - 1), pow(2, N - 1) + 2, N);
		//打印输出数组
		Display(show, 3 * pow(2, N - 1) - 1, 3 * pow(2, N) - 2);
		//打印树干
		for (int i = 0; i < N; i++)
		{
			int j = (int)3 * pow(2, N - 1);
			printf("%*c\n", j,'*');
		}
	}
	return 0;
}