Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7915 | Accepted: 4148 |
Description
Input
Output
Sample Input
2 8 12 -1
Sample Output
3 153 2131
Source
#include <map> #include <set> #include <list> #include <stack> #include <queue> #include <vector> #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int dp[100][100]; struct node { int cur, last; }status[100]; int m, res; void dfs(int l, int cur, int last) { if (l > m) { return ; } if (l == m) { status[res].cur = cur; status[res++].last = last; return ; } dfs( l + 1, (cur << 1), (last << 1 | 1) ); dfs( l + 1, (cur << 1 | 1), (last << 1) ); dfs( l + 2, (cur << 2 | 3), (last << 2 | 3)); } int main() { while (~scanf("%d", &m) && m != -1) { int n = 3; if (m & 1) { printf("0\n"); continue; } if (m > n) { swap(n, m); } res = 0; dfs(0, 0, 0); memset ( dp, 0, sizeof(dp) ); dp[0][(1 << m) - 1] = 1; for (int i = 1; i <= n; i++) { for (int j = 0; j < res; j++) { dp[i][status[j].cur] += dp[i - 1][status[j].last]; } } printf("%d\n", dp[n][(1 << m) - 1]); } return 0; }