結果
問題 | No.2733 Just K-times TSP |
ユーザー |
|
提出日時 | 2024-04-19 22:39:21 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 214 ms / 2,000 ms |
コード長 | 1,845 bytes |
コンパイル時間 | 3,045 ms |
コンパイル使用メモリ | 250,912 KB |
実行使用メモリ | 28,288 KB |
最終ジャッジ日時 | 2024-10-11 16:21:41 |
合計ジャッジ時間 | 4,525 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 32 |
ソースコード
#ifdef LOCAL#include <local.hpp>#else#include <bits/stdc++.h>#define debug(...) ((void)0)#define postprocess(...) ((void)0)#endif#include <atcoder/modint.hpp>using mint = atcoder::modint998244353;namespace atcoder {template <int m, std::enable_if_t<(1 <= m)>* = nullptr>std::ostream& operator<<(std::ostream& os, const static_modint<m>& x) {return os << x.val();}} // namespace atcoderusing namespace std;using ll = long long;using ld = long double;int N, M, K;vector<int> adj[10];int hash_state(const int cur, const vector<int>& rem) {assert((int)rem.size() == N);int ret = 0;for (int i = 0; i < N; i++) {ret *= (K + 1);ret += rem[i];}return ret * 6 + cur;}optional<mint> memo[3200000];mint rec(int cur, vector<int>& rem) {auto key = hash_state(cur, rem);if (memo[key].has_value()) return memo[key].value();bool finished = true;for (int i = 0; i < N; i++) {finished &= (rem[i] == 0);}if(finished) return 1;mint ret = 0;for (auto&& next : adj[cur]) {if (rem[next] > 0) {rem[next] -= 1;ret += rec(next, rem);rem[next] += 1;}}return (memo[key] = ret).value();}void solve([[maybe_unused]] int test) {cin >> N >> M >> K;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);}mint ans = 0;vector<int> rem(N, K);for (int i = 0; i < N; i++) {rem[i] -= 1;ans += rec(i, rem);rem[i] += 1;}cout << ans << endl;}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;// cin >> t;for (int i = 1; i <= t; i++) {solve(i);}postprocess();}