/*
方法一:
找第n种情况,考虑用递推(这种解法类似于杭电OJ 2047,从第n种填什么去分析)
第n种情况可以填入的字符串有E,O,F三种情况
1.当填E时,前面n-1个填的方法数是a[n-1],
2.当填F时,前面n-1个填的方法数是a[n-1],
3.当填O时,因为相邻两个不能是O,O,所以第n-1种只能填E,F,因为a[n-1]的第n-1种必须E,O,F都要填入,(关键弄清a[n-1]代表什么意义,不满足就继续往前找a[n-2],直到满足为止)
所以往前看第n-2种,因为第n-1种只能填E,F,所以第n-2种可填入三种字符,即a[n-2],
所以填O时的方法数为2*a[n-2]
*/
#include
using namespace std;
int main(){
__int64 a[50];//long long都放不下的用__int64来存储
a[1] = 3;
a[2] = 8;
int n;
while(cin >> n){
for(int i = 3; i <= n; i++){
a[i] = 2*a[i-1] + 2*a[i-2];
}
cout << a[n] << endl;
}
return 0;
}
//===============================================================================================
/*
方法二: (实际是在方法一的基础上向下递推了一次,思路一样)
找第n种情况,考虑用递推,去找第n-1种情况
因为相邻两个不能是O,O,所以第n-1种填的进行分类讨论
1.当第n-1种填的不是O,即填的是E,F时,第n种可填E,O,F三种字符,而a[n-1]代表第n-1种三种字符都要填入,这里只填了E,F
所以考虑第n-2种情况,因为第n-1种填的是E,F,所以第n-2种可填入三种字符,即a[n-2],
当第n-1种填的不是O,方法数:3*2*a[n-2]
2.当第n-1种填的是O,第n种只能填入E,F,而a[n-1]代表第n-1种三种字符都要填入,这里只填了O
所以考虑第n-2种情况,因为第n-1种填的是O,所以第n-2种只能填入E,F,而a[n-2]代表第n-2种三种字符都要填入,这里只填了E,F
所以考虑第n-3种情况,因为第n-2种填的是E,F,所以第n-3种可填入三种字符,即a[n-3],
当第n-1种填的是O,方法数:2*1*2*a[n-3]
*/
/*
错误做法:
找第n种情况,去找第n-1种的情况
1.当第n-1种填的是O,则第n种只能填E,F,所以方法数:2*a[n-1],但是a[n-1]代表的是三种都要填入,这里只填了O,是不是多算了呢?!
所以递推时要弄清a[n-1]等式子代表的意义
*/
#include
using namespace std;
int main(){
__int64 a[50];
a[1] = 3;
a[2] = 8;
a[3] = 22;
int n;
while(cin >> n){
for(int i = 4; i <= n; i++){
a[i] = a[i - 3]*2*1*2 + a[i - 2]*2*3;//有了i-3的情况就要把基础提升到从4开始
}
cout << a[n] << endl;
}
return 0;
}