結果
問題 | No.2428 Returning Shuffle |
ユーザー | Today03 |
提出日時 | 2023-08-18 23:09:19 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 625 ms / 2,000 ms |
コード長 | 1,372 bytes |
コンパイル時間 | 2,521 ms |
コンパイル使用メモリ | 219,048 KB |
実行使用メモリ | 198,620 KB |
最終ジャッジ日時 | 2024-11-28 09:49:06 |
合計ジャッジ時間 | 7,626 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 23 |
ソースコード
#include <bits/stdc++.h> using namespace std; #include <atcoder/modint> using mint = atcoder::modint998244353; #include <atcoder/scc> vector<pair<long long, int>> prime_factorize(long long n) { vector<pair<long long, int>> ret; for (long long i = 2; i * i <= n; i++) { if (n % i != 0) { continue; } int ex = 0; while (n % i == 0) { ex++; n /= i; } ret.push_back({i, ex}); } if (n != 1) { ret.push_back({n, 1}); } return ret; } int main() { int n, m; cin >> n >> m; vector<int> p(n); iota(p.begin(), p.end(), 0); for (int i = 0; i < m; i++) { int t; cin >> t; vector<int> s(t); for (int j = 0; j < t; j++) { cin >> s[j]; s[j]--; } int start = p[s[t - 1]]; for (int j = t - 2; j >= 0; j--) { p[s[j + 1]] = p[s[j]]; } p[s[0]] = start; } atcoder::scc_graph g(n); int ed = 0; for (int i = 0; i < n; i++) { if (i == p[i]) { continue; } ed++; g.add_edge(i, p[i]); } auto res = g.scc(); vector<int> ps(n + 1); for (auto x : res) { auto pf = prime_factorize(x.size()); for (auto [p, e] : pf) { ps[p] = max(ps[p], e); } } mint ans = 1; for (int i = 1; i <= n; i++) { mint add = 1; for (int j = 0; j < ps[i]; j++) { add *= i; } ans *= add; } cout << ans.val() << endl; }