結果
| 問題 |
No.2531 Coloring Vertices on Namori
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-11-12 04:33:46 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 669 ms / 2,000 ms |
| コード長 | 1,586 bytes |
| コンパイル時間 | 368 ms |
| コンパイル使用メモリ | 82,448 KB |
| 実行使用メモリ | 154,608 KB |
| 最終ジャッジ日時 | 2024-09-26 03:00:34 |
| 合計ジャッジ時間 | 14,430 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 31 |
ソースコード
from collections import *
from itertools import *
from functools import *
from heapq import *
import sys,math
input = sys.stdin.readline
# sys.setrecursionlimit(10**6)
N,K = map(int,input().split())
e = [[] for _ in range(N)]
for _ in range(N):
u,v = map(int,input().split())
u -= 1
v -= 1
e[u].append(v)
e[v].append(u)
def namori_decomposition(e):
## cycle,root
## root : その頂点が属するcycle上の点を返す
n = len(e)
deg = [len(e[i]) for i in range(n)]
v = deque()
for i in range(n):
if deg[i]==1:
v.append(i)
cycle = [True]*n
while v:
x = v.popleft()
cycle[x]=False
for ix in e[x]:
deg[ix] -= 1
if deg[ix] == 1:
v.append(ix)
E = [[] for _ in range(n)]
for i in range(n):
for j in e[i]:
if cycle[i]&cycle[j]:
continue
E[i].append(j)
E[j].append(i)
root = [-1]*n
for i in range(n):
if cycle[i]:
v.append(i)
root[i] = i
while v:
x = v.popleft()
for ix in E[x]:
if root[ix]==-1:
root[ix] = i
v.append(ix)
return cycle,root
cycle,root = namori_decomposition(e)
n = sum(cycle)
mod = 998244353
C = Counter(root)
ans = (K-1)*(pow(K-1,n-1,mod) - pow(-1,n-1,mod))%mod
#956138134
for v in C.values():
ans *= pow(K-1,v-1,mod)
ans %= mod
print(ans)