結果
問題 |
No.1937 Various Tournament
|
ユーザー |
![]() |
提出日時 | 2025-06-12 15:02:14 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,400 bytes |
コンパイル時間 | 1,239 ms |
コンパイル使用メモリ | 82,560 KB |
実行使用メモリ | 106,560 KB |
最終ジャッジ日時 | 2025-06-12 15:02:30 |
合計ジャッジ時間 | 4,360 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 3 |
other | AC * 1 TLE * 1 -- * 45 |
ソースコード
import sys from itertools import combinations def main(): N = int(sys.stdin.readline()) S = [] for _ in range(N): row = list(map(int, sys.stdin.readline().split())) S.append(row) # Precompute participants for each mask participants = {} for mask in range(1 << N): parts = [] for i in range(N): if mask & (1 << i): parts.append(i) participants[mask] = parts # Precompute size for each mask size = {} for mask in range(1 << N): cnt = 0 for i in range(N): if mask & (1 << i): cnt += 1 size[mask] = cnt # Initialize DP dp = [{} for _ in range(1 << N)] for mask in range(1 << N): if size[mask] == 1: r = participants[mask][0] dp[mask][r] = 1 # Process masks in order of increasing size for mask in range(1 << N): sz = size[mask] if sz <= 1: continue if (sz & (sz - 1)) != 0: continue # Not a power of two half = sz // 2 # Enumerate all possible left masks of size half for L_mask in range(mask + 1): if (L_mask & mask) == L_mask and size[L_mask] == half: R_mask = mask ^ L_mask # Now, L_mask and R_mask are both subsets of mask with size half # Iterate over all possible roots in L_mask and R_mask for r1 in participants[L_mask]: if r1 not in dp[L_mask]: continue for r2 in participants[R_mask]: if r2 not in dp[R_mask]: continue # Determine the winner if S[r1][r2] == 1: winner = r1 else: winner = r2 # Update the dp[mask][winner] ways = dp[L_mask][r1] * dp[R_mask][r2] if winner in dp[mask]: dp[mask][winner] += ways else: dp[mask][winner] = ways # The result for each k is dp[full_mask][k] full_mask = (1 << N) - 1 for k in range(N): print(dp[full_mask].get(k, 0)) if __name__ == "__main__": main()