結果
| 問題 |
No.2435 Order All Company
|
| コンテスト | |
| ユーザー |
👑 SPD_9X2
|
| 提出日時 | 2023-08-18 22:24:38 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 408 ms / 2,000 ms |
| コード長 | 2,183 bytes |
| コンパイル時間 | 188 ms |
| コンパイル使用メモリ | 81,664 KB |
| 実行使用メモリ | 118,084 KB |
| 最終ジャッジ日時 | 2024-11-28 08:09:13 |
| 合計ジャッジ時間 | 8,143 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 36 |
ソースコード
"""
包除原理+行列木定理
"""
import sys
from sys import stdin
def Detmod(a,mod = 10**18+3):
assert len(a) == len(a[0])
n = len(a)
b = [[a[i][j] for j in range(n)] for i in range(n)]
ret = 1
for x in range(n):
ret *= b[x][x]
ret %= mod
if b[x][x] == 0:
return 0
inv = pow(b[x][x],mod-2,mod)
for i in range(x+1,n):
mul = b[i][x] * inv
for j in range(x,n):
b[i][j] -= b[x][j] * mul
b[i][j] %= mod
return ret
# need Detmod
class MatrixTreeTheorem():
def __init__(self):
self.vdic = {}
self.edges = []
def add_vertex(self,v):
if v not in self.vdic:
self.vdic[v] = len(self.vdic)
return
def add_edge(self,u,v):
assert u in self.vdic
assert v in self.vdic
if u == v:
return
self.edges.append( (self.vdic[u],self.vdic[v]) )
def calc(self, mod = 10**18+3):
if len(self.vdic) == 0:
return 1
elif len(self.vdic) == 1:
return 1
H = [[0] * len(self.vdic) for i in range(len(self.vdic))]
for u2,v2 in self.edges:
H[u2][u2] += 1
H[v2][v2] += 1
H[v2][u2] -= 1
H[u2][v2] -= 1
for i in range(len(self.vdic)):
del H[i][-1]
del H[-1]
return Detmod(H,mod)
mod = 998244353
N,K = map(int,stdin.readline().split())
ab = [ [] for i in range(K) ]
for lp in range(K):
t = int(stdin.readline())
for i in range(t):
a,b = map(int,stdin.readline().split())
a -= 1
b -= 1
ab[lp].append( (a,b) )
ans = 0
for bit in range(2**K):
zero = 0
for i in range(K):
if 2**i & bit == 0:
zero += 1
mt = MatrixTreeTheorem()
for i in range(N):
mt.add_vertex(i)
for i in range(K):
if 2**i & bit > 0:
for a,b in ab[i]:
mt.add_edge(a,b)
now = mt.calc(mod = 998244353)
if zero % 2 == 0:
ans += now
else:
ans -= now
print (ans % mod)
SPD_9X2