#include #include #include typedef unsigned int u32; typedef unsigned long long int u64; using namespace std; typedef u64 T; #define M 1000 #define L 100000000 #define MOD(x) ((x)%L) #define W 120 #define H 12 T c[M][M]; // 変換行列 T q[M][2]; // 変換行列計算のための一時的なキャッシュ vector> v; void EnumerateState(bitset &a, u32 n) { if (n == H+1) { v.push_back(a); } else { bool b1 = n==0; if (!b1) b1 = a[n-1]; if (b1) { a[n] = false; EnumerateState(a, n + 1); } a[n] = true; EnumerateState(a, n + 1); } } T GetNext(bitset &a, bitset &b, u32 i, bool f) { u32 j = f?1:0; if (q[i][j] != 0) return q[i][j]; T r = 0; if (i == H+1) return j; if (a[i]) { if (b[i]) { if (f) { r = MOD(2 * GetNext(a, b, i+1, true) + 2 * GetNext(a, b, i+1, false)); } else { r = MOD(GetNext(a, b, i+1, true) + 2 * GetNext(a, b, i+1, false)); } } else { if (f) { // do nothing. } else { r = MOD(GetNext(a, b, i+1, true)); } } } else { if (b[i]) { if (f) { r = MOD(GetNext(a, b, i+1, true) + GetNext(a, b, i+1, false)); } else { r = MOD(GetNext(a, b, i+1, false)); } } else { if (f) { // do nothing. } else { r = MOD(GetNext(a, b, i+1, true)); } } } q[i][j] = r; return r; } int main(int argc, char* argv[]) { bitset a, b; // ステップ1:可能な状態を列挙する. EnumerateState(a, 0); // ステップ2:W-1 に対する各状態のパターン数から // W に対する各状態のパターン数を得る変換行列を計算する. for (u32 i=0; i h; for (u32 i=0; i<1<>= 1; } for (u32 j=0; j