#include<iostream>
using namespace std;
int main(){
int n,i;
cin>>n;
long long a[4000][6];
a[0][0]=1;
for(i=1;i<6;i++) a[0][i] = 0;
for(i=1;i<n;i++){
a[i][0] = 1;
a[i][1] = (1+2*a[i-1][1])%1000000007;
a[i][2] = (1+a[i-1][2])%1000000007;
a[i][3] = (a[i-1][1]+2*a[i-1][3])%1000000007;
a[i][4] = (a[i-1][1]+a[i-1][2]+2*a[i-1][4])%1000000007;
a[i][5] = (a[i-1][3]+a[i-1][4]+2*a[i-1][5])%1000000007;
}
cout<<a[n-1][5];
return 0;
}
/*根据题意,分析知道第一位只能是2。当我们分析到第i位的时候,这i个数可能面临几种情况
0 出现了2
1 出现了2和0
2 出现了2和3
3 出现了2、 0 、 1
4 出现了2 、 0 、 3
5 出现了2. 0. 1、 3
以上表示为二维数组a[i][j] ,表示这种状态有多少个。
那么a[i+1][j]怎么表示呢?
a[i][0] = 1;
a[i][1] = (1+2*a[i-1][1])%1000000007;
a[i][2] = (1+a[i-1][2])%1000000007;
a[i][3] = (a[i-1][1]+2*a[i-1][3])%1000000007;
a[i][4] = (a[i-1][1]+a[i-1][2]+2*a[i-1][4])%1000000007;
a[i][5] = (a[i-1][3]+a[i-1][4]+2*a[i-1][5])%1000000007;
本题用到的思想是动态规划
*/