/*
[5, 4]
[2, 1]
*/
/*
#include <stdio.h>
int n,x,y;
int numArr[31]={0};
typedef struct {
int a,b;
} Arr;
Arr k[31];
void saveArr(int sum) {
if(n==0) {
return;
}
numArr[sum] = n--;
saveArr(sum-1);
}
void saveArr1(int sum) {
if(x==0) {
return;
}
k[sum].a = x--;
saveArr1(sum-1);
}
void saveArr2(int sum) {
if(y==0) {
return;
}
k[sum].b = y--;
saveArr2(sum-1);
}
void sumArr() {
}
int main() {
scanf("%d %d", &n, &x);
y=n-x;
saveArr(n);
saveArr1(x);
saveArr2(y);
sum
}
*/
/*
#include <stdio.h>
int sum=0;
void disNode(int x,int y) {
if(x>y) {
sum++;
disNode(x/2,y);
}
else if(x<y) {
sum++;
disNode(x,y/2);
}
else {
printf("%d", sum);
return;
}
}
int main() {
int a,b;
scanf("%d %d", &a, &b);
disNode(a,b);
}
*/
/*
#include <stdio.h>
int a[100000000]={0};
int t=0;
int rec(int n) {
t++;
if(n==1) {
return t;
}
else if(n%2==0) {
n=n/2;
}
else {
n=n*3+1;
}
rec(n);
}
int main() {
int s,e,i;
int max=0;
int max1=0;
scanf("%d %d", &s, &e);
for(i=s; i<=e; i++) {
a[i] = rec(i);
t=0;
}
for(i=s; i<=e; i++) {
if(i==s) {
max = s;
max1 = a[i];
}
if(max1<a[i]) {
max1 = a[i];
max = i;
}
}
printf("%d %d", max, max1);
}
*/
/*
#include <stdio.h>
int a[10001]={0};
int colBlocks(int n) {
if(a[n]!=0) {
return a[n];
}
if(n==1) {
return a[n]=1;
}
if(n==2) {
return a[n]=2;
}
return a[n] = (colBlock(n-1)+colBlock(n-2))%100000007;
}
int main() {
int n;
scanf("%d", &n);
printf("%d", colBlock(n));
}
*/
#include <stdio.h>
int a[10001]={0};
int colBlocks(int n) {
if(a[n]!=0) {
return a[n];
}
if(n==1) {
return a[n]=1;
}
if(n==2) {
return a[n]=3;
}
return a[n] = (colBlocks(n-1)+(colBlocks(n-2)*2));
}
int main() {
int n;
scanf("%d", &n);
printf("%d", colBlocks(n));
}