#include<cstdio>
using namespace std;
int l,n;
int a[201],b[201];
void gjc()
{
int t=0;//求每次移完后剩下哟多少可以移动的。
for (int j=200;j>0;j--)
{
l=b[j]*2+t;//每次加上b数组的得数乘上二,这里很关键,因为N等于2N个圆盘,所以要把B[J]乘上二,然后再加上剩下的多少才可求出一共有多少个可移动的。
b[j]=l%10;//每次B【J】要进行递除,不然结果不变
t=l/10;//每次t要进行递除,不然结果不变
}
}
void gjc()
{
int t=0;
for (int j=200;j>0;j--)
{
l=b[j]*2+t;
b[j]=l%10;
t=l/10;
}
}
void gjj()
{
int t=0;
for (int j=200;j>0;j--)
{
l=a[j]+b[j]+t;
a[j]=l%10;
t=l/10;
}
}
int main()
{
scanf("%d",&n);//输入圆盘的个数。
b[200]=1;//把B数组的第二百位存为1,
因为本身在一个位置,也要进行判断,否则
答案会有误差
for (int i=1;i<=n;
{gjc();gjj();}//进入函数判断。
int k=1;
while (a[k]==0&&k<200)//判断运行次数,并进行累加。
k++;
for (int i=k;i<=200;i++)//从k次执行到200次
printf("%d",a[i]);//输出数量。
}