//对于小白来说,是真滴难~,只能仿造大佬的思路来写
#include <stdio.h>
#include <math.h>
int main() {
    int a = 0;    
    while (~scanf("%d", &a))
    {
        char arr[800][800]={0}; 
        int top_y = 3*pow(2,a-1)-1;//确定顶点*的位置
        arr[0][top_y] = '*';
        arr[1][top_y-1] = '*';
        arr[1][top_y+1] = '*';
        arr[2][top_y-2] = '*';
        arr[2][top_y] = '*';
        arr[2][top_y+2] = '*';//每次进来,先确定一个小树,接着就是要复制小树
        //将小树复制到该小树的左下角和右下角,复制完之后整体又当作一个树
        //接着再将该整体树又复制到该整体树的左下角和右下角,就这样一直循环下去
        int i = 0;
        //先进行复制
        for (i = 1; i < a; i++)//复制次数。已经确定了一个小树,复制次数要比输入的数字少1
        {
            int range = 3*pow(2,i-1)-1;//每次要复制的树是几层,层数从0开始计数,因为数组是从0开始
            int x = 0;
            for(x=0; x<=range; x++)//需要复制的层数
            {
                int y = 0;
                for(y=top_y-range; y<=top_y+range; y++)//每一层复制多少次
                {
                    arr[x+range+1][y-range-1]=arr[x][y];//复制到左边,从小树左下角的第一个*先复制
                    arr[x+range+1][y+range+1]=arr[x][y];//复制到右边,从小树左下脚的第一个*先复制
                }
            }
        }
        //开始打印树
        for(i=0; i<=3*pow(2,a-1)-1; i++)
        {
            int j = 0;
            for(j=0; j<=3*pow(2,a)-2; j++)
            {
                if(arr[i][j]=='*')
                {
                    printf("%c",arr[i][j]);
                }
                else
                {
                    printf(" ");
                }
            }
            printf("\n");
        }
        //打印树干
        for(i=0; i<a; i++)
        {
            int j = 0;
            for(j=0; j<3*pow(2,a-1)-1; j++)
            {
                printf(" ");
            }
            printf("*\n");
        }
    }
    return 0;
}