結果
問題 |
No.2152 [Cherry Anniversary 2] 19 Petals of Cherry
|
ユーザー |
![]() |
提出日時 | 2025-04-16 15:25:10 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 367 ms / 1,000 ms |
コード長 | 2,040 bytes |
コンパイル時間 | 322 ms |
コンパイル使用メモリ | 81,860 KB |
実行使用メモリ | 133,316 KB |
最終ジャッジ日時 | 2025-04-16 15:26:01 |
合計ジャッジ時間 | 15,168 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 49 |
ソースコード
import sys from itertools import combinations def read_input(): M = [[0]*19 for _ in range(19)] for i in range(19): parts = list(map(int, sys.stdin.readline().split())) L_i = parts[0] elements = parts[1:] for x in elements: j = x - 1 # convert to 0-based M[i][j] = 1 return M def determinant_bareiss(matrix): n = len(matrix) m = [row[:] for row in matrix] sign = 1 prev_pivot = 1 for k in range(n-1): # Find pivot in column k pivot_row = -1 for i in range(k, n): if m[i][k] != 0: pivot_row = i break if pivot_row == -1: return 0 if pivot_row != k: m[k], m[pivot_row] = m[pivot_row], m[k] sign *= -1 pivot = m[k][k] for i in range(k+1, n): for j in range(k+1, n): m[i][j] = (m[i][j] * pivot - m[i][k] * m[k][j]) // prev_pivot m[i][k] = 0 prev_pivot = pivot det = sign * m[-1][-1] return det def compute_permanent(M): n = 19 dp = [0] * (1 << n) dp[0] = 1 for i in range(n): next_dp = [0] * (1 << n) # Generate all masks with i bits set. for bits in combinations(range(n), i): mask = 0 for b in bits: mask |= (1 << b) current_count = dp[mask] if current_count == 0: continue # Iterate over all possible j in this row. for j in range(n): if M[i][j] == 0: continue if not (mask & (1 << j)): new_mask = mask | (1 << j) next_dp[new_mask] += current_count dp = next_dp return dp[(1 << n) - 1] def main(): M = read_input() det = determinant_bareiss(M) perm = compute_permanent(M) X_even = (perm + det) // 2 X_odd = (perm - det) // 2 print(X_even, X_odd) if __name__ == "__main__": main()