結果
| 問題 |
No.2531 Coloring Vertices on Namori
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-11-12 03:57:51 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 667 ms / 2,000 ms |
| コード長 | 1,693 bytes |
| コンパイル時間 | 173 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 154,716 KB |
| 最終ジャッジ日時 | 2024-09-26 03:00:18 |
| 合計ジャッジ時間 | 13,939 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / 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
dp = [[0]*(n+1) for _ in range(2)]
dp[1][1] = K
for i in range(1,n):
dp[1][i+1] = dp[0][i]%mod
dp[0][i+1] = (dp[0][i]*(K-2) + dp[1][i]*(K-1))%mod
C = Counter(root)
ans = dp[0][n]
for v in C.values():
ans *= pow(K-1,v-1,mod)
ans %= mod
print(ans)