結果

問題 No.541 3 x N グリッド上のサイクルの個数
コンテスト
ユーザー sadragonball
提出日時 2026-06-23 18:14:32
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 1,304 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 4,779 ms
コンパイル使用メモリ 338,904 KB
実行使用メモリ 7,972 KB
最終ジャッジ日時 2026-06-23 18:14:45
合計ジャッジ時間 8,434 ms
ジャッジサーバーID
(参考情報)
judge1_1 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other WA * 20 RE * 42
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;

static const int MOD = 1e9 + 7;
static const int S = 8;

vector<int> trans[S];

bool valid(int cur, int nxt) {
    // 核心正确约束:
    // 1. 不允许断开已有连接
    if ((cur & ~nxt) != 0) return false;

    // 2. 不允许产生非法孤立结构(关键修正点)
    // 防止 101 这种不可能由 tile 构造的结构
    int x = cur | nxt;

    // 必须满足:不能出现“单侧悬空连接”
    if ((x & 0b101) == 0b001) return false;
    if ((x & 0b101) == 0b100) return false;

    return true;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N;
    cin >> N;

    for (int i = 0; i < S; i++) {
        for (int j = 0; j < S; j++) {
            if (valid(i, j)) {
                trans[i].push_back(j);
            }
        }
    }

    vector<vector<long long>> dp(N + 1, vector<long long>(S, 0));

    // 初始:空列
    dp[1][0] = 1;

    for (int i = 2; i <= N; i++) {
        for (int cur = 0; cur < S; cur++) {
            for (int nxt : trans[cur]) {
                dp[i][nxt] = (dp[i][nxt] + dp[i - 1][cur]) % MOD;
            }
        }
    }

    long long ans = 0;
    for (int i = 0; i < S; i++) {
        ans = (ans + dp[N][i]) % MOD;
    }

    cout << ans << "\n";
}
0