結果
問題 |
No.1773 Love Triangle
|
ユーザー |
|
提出日時 | 2023-02-06 13:00:14 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 84 ms / 2,000 ms |
コード長 | 1,546 bytes |
コンパイル時間 | 1,917 ms |
コンパイル使用メモリ | 196,352 KB |
最終ジャッジ日時 | 2025-02-10 11:19:55 |
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 90 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:25:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 25 | scanf("%d %d", &n, &m); | ~~~~~^~~~~~~~~~~~~~~~~ main.cpp:28:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 28 | scanf("%d %d %d", &u, &v, &w); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h> #define File(a) freopen(a ".in", "r", stdin), freopen(a ".out", "w", stdout) using uint = unsigned; using ll = long long; using ull = unsigned long long; using pii = std::pair<int, int>; const int N = 505; const int Mod = 998244353; void inc(int &a, int b) { (a += b) >= Mod ? a -= Mod : a; } void dec(int &a, int b) { (a -= b) < 0 ? a += Mod : a; } int pow(int a, int b, int ans = 1); int rank(); std::mt19937_64 rnd(std::random_device{}()); std::uniform_int_distribution<int> D(0, Mod - 1); int mat[N][N]; int n, m; int main() { scanf("%d %d", &n, &m); for (int i = 1; i <= m; ++i) { int u, v, w; scanf("%d %d %d", &u, &v, &w); int x = D(rnd); inc(mat[u][v], x), inc(mat[v][w], x), inc(mat[w][u], x); dec(mat[v][u], x), dec(mat[w][v], x), dec(mat[u][w], x); } printf("%d\n", rank() / 2); return 0; } int rank() { int ans = 0; for (int i = 1; i <= n; ++i) { int now = 0; for (int j = ans + 1; j <= n; ++j) { if (mat[j][i]) now = j; } if (!now) continue; ++ans; if (now != ans) std::swap(mat[ans], mat[now]); int iv = pow(mat[ans][i], Mod - 2); for (int j = i; j <= n; ++j) mat[ans][j] = 1ll * mat[ans][j] * iv % Mod; for (int j = ans + 1; j <= n; ++j) { for (int k = n; k >= i; --k) mat[j][k] = (mat[j][k] + 1ll * (Mod - mat[j][i]) * mat[ans][k]) % Mod; } } return ans; } int pow(int a, int b, int ans) { while (b) { if (b & 1) ans = 1ll * ans * a % Mod; a = 1ll * a * a % Mod; b >>= 1; } return ans; }