結果
問題 |
No.3105 Parallel Connection and Spanning Trees
|
ユーザー |
![]() |
提出日時 | 2025-01-13 03:29:17 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,466 bytes |
コンパイル時間 | 2,659 ms |
コンパイル使用メモリ | 203,924 KB |
実行使用メモリ | 140,380 KB |
最終ジャッジ日時 | 2025-01-18 05:38:21 |
合計ジャッジ時間 | 68,104 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 11 TLE * 21 |
ソースコード
// naive #include<bits/stdc++.h> using namespace std; #include<atcoder/modint> typedef atcoder::modint998244353 mint; mint det(vector<vector<mint>> &a){ assert(a.size() == a[0].size()); int n = (int)a.size(); vector<vector<mint>> b = a; int piv = 0; mint ret = 1; for (int j=0; j<n; j++){ for (int i=piv; i<n; i++){ if (b[i][j] != 0){ swap(b[i], b[piv]); if (i != piv) ret = -ret; mint ip = b[piv][j].inv(); for (int l=0; l<n; l++){ if (l != piv){ mint tmp = ip * b[l][j]; for (int k=j; k<n; k++){ b[l][k] -= tmp * b[piv][k]; } } } ret *= b[piv][j]; for (int k=j; k<n; k++){ b[piv][k] *= ip; } piv++; break; } } } for (int i=0; i<n; i++){ ret *= b[i][i]; } return ret; } int main() { int k; cin >> k; int cnt = 2; vector<int> a, b; vector<int> s, t; for(int i=0; i<k; i++) { int n, m; cin >> n >> m; a.push_back(0); b.push_back(cnt); a.push_back(1); b.push_back(cnt + 1); for (int j=0; j<m; j++) { int x, y; cin >> x >> y; x--; y--; a.push_back(x + cnt); b.push_back(y + cnt); } cnt += n; } vector mat(cnt-1, vector<mint>(cnt-1)); for (int i=0; i<(int)a.size(); i++) { if (a[i] - 1 >= 0 && b[i] - 1 >= 0) { mat[a[i]-1][b[i]-1] -= 1; mat[b[i]-1][a[i]-1] -= 1; } if (a[i] - 1 >= 0) { mat[a[i]-1][a[i]-1] += 1; } if (b[i] - 1 >= 0) { mat[b[i]-1][b[i]-1] += 1; } } cout << det(mat).val() << endl; }