結果
問題 | No.2531 Coloring Vertices on Namori |
ユーザー |
👑 ![]() |
提出日時 | 2023-10-19 02:22:12 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 550 ms / 2,000 ms |
コード長 | 1,711 bytes |
コンパイル時間 | 182 ms |
コンパイル使用メモリ | 82,560 KB |
実行使用メモリ | 115,192 KB |
最終ジャッジ日時 | 2024-09-18 22:24:01 |
合計ジャッジ時間 | 14,098 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 31 |
ソースコード
from collections import dequeclass UnionFind:def __init__(self, N):self.tree_size = Nself.parent = [i for i in range(N)]self.rank = [1 for _ in range(N)]def root(self, a):now = awhile now != self.parent[now]:now = self.parent[now]return nowdef same(self, a, b):return self.root(a) == self.root(b)def merge(self, a, b):rta = self.root(a)rtb = self.root(b)if rta != rtb:if self.rank[rta] == self.rank[rtb]:self.parent[rtb] = self.parent[rta]self.rank[rta] += 1elif self.rank[rta] > self.rank[rtb]:self.parent[rtb] = self.parent[rta]else:self.parent[rta] = self.parent[rtb]mod = 998244353N, K = map(int, input().split())graph = [[] for _ in range(N)]tree = UnionFind(N)dist = [N + 2 for _ in range(N)]cnt = 0dq = deque()for i in range(N):u, v = map(int, input().split())u -= 1v -= 1if tree.same(u, v):dist[u] = 0dq.append(u)while len(dq) > 0:p = dq.popleft()for x in graph[p]:if dist[x] < N:continuedist[x] = dist[p] + 1dq.append(x)cnt = dist[v] + 1breakelse:graph[u].append(v)graph[v].append(u)tree.merge(u, v)dp = [[0, 0] for _ in range(N)]dp[0][0] = Kfor i in range(1, N):dp[i][0] = dp[i - 1][1]dp[i][1] = (dp[i - 1][0] * (K - 1) + dp[i - 1][1] * (K - 2)) % modans = dp[cnt - 1][1]for i in range(N - cnt):ans = (ans * (K - 1)) % modprint(ans)