結果

問題 No.2733 Just K-times TSP
コンテスト
ユーザー norioc
提出日時 2025-10-21 20:56:39
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 1,984 bytes
コンパイル時間 3,368 ms
コンパイル使用メモリ 288,748 KB
実行使用メモリ 56,676 KB
最終ジャッジ日時 2025-10-21 20:56:53
合計ジャッジ時間 14,123 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 31 TLE * 1
権限があれば一括ダウンロードができます

ソースコード

diff #

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

const ll MOD = 998244353;

int N, M, K;
vector<vector<int>> adj;

// 状態 keys を (K+1)-進数で整数にパック
ll pack_state(const vector<int>& keys) {
    ll res = 0;
    ll b = 1;
    for (int k : keys) {
        res += 1LL * k * b;
        b *= (K + 1);
    }
    return res;
}

// 整数 x を keys にアンパック
vector<int> unpack_state(ll x) {
    vector<int> res(N);
    ll s = x;
    ll b = K + 1;
    for (int i = 0; i < N; i++) {
        res[i] = s % b;
        s /= b;
    }
    return res;
}

ll tsp(int start) {
    ll size = 1;
    for (int i = 0; i < N; i++) size *= (K + 1);

    vector<vector<ll>> dp(size, vector<ll>(N, 0));
    vector<int> keys(N, 0);
    keys[start] = 1;
    dp[pack_state(keys)][start] = 1;

    for (ll i = 0; i < size; i++) {
        vector<int> cnts = unpack_state(i);
        for (int j = 0; j < N; j++) {
            if (cnts[j] == 0) continue;
            ll cur = dp[i][j];
            if (cur == 0) continue;

            for (int to : adj[j]) {
                if (cnts[to] == K) continue;
                vector<int> xs = cnts;
                xs[to] += 1;
                ll nk = pack_state(xs);
                dp[nk][to] += cur;
                if (dp[nk][to] >= MOD) dp[nk][to] -= MOD;
            }
        }
    }

    vector<int> full(N, K);
    ll nk = pack_state(full);
    ll res = 0;
    for (int i = 0; i < N; i++) {
        res += dp[nk][i];
        if (res >= MOD) res -= MOD;
    }
    return res;
}

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

    cin >> N >> M >> K;
    adj.assign(N, {});

    for (int i = 0; i < M; i++) {
        int u, v;
        cin >> u >> v;
        u--, v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    ll ans = 0;
    for (int i = 0; i < N; i++) {
        ans += tsp(i);
        if (ans >= MOD) ans -= MOD;
    }

    cout << ans % MOD << "\n";
    return 0;
}
0