結果
| 問題 | No.1937 Various Tournament |
| コンテスト | |
| ユーザー |
sotanishy
|
| 提出日時 | 2022-05-13 22:07:02 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 771 ms / 2,000 ms |
| コード長 | 853 bytes |
| 記録 | |
| コンパイル時間 | 182 ms |
| コンパイル使用メモリ | 85,120 KB |
| 実行使用メモリ | 94,872 KB |
| 最終ジャッジ日時 | 2026-04-03 06:54:36 |
| 合計ジャッジ時間 | 23,037 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 47 |
ソースコード
import sys
input = sys.stdin.readline
def subset(N, k):
S = (1<<k)-1
st = []
while S < (1<<N):
st.append(S)
x = S & -S
y = S + x
S = ((S & ~y) // x >> 1) | y
return st
N = int(input())
S = [list(map(int, input().split())) for _ in range(N)]
dp = [[0] * N for _ in range(1<<N)]
# dp[S][i] = number of ways where i wins the tournament of people in S
for i in range(N):
dp[1<<i][i] = 1
k = 0
while 2**k < N:
st = subset(N, 2**k)
for l, X in enumerate(st):
for Y in st[l+1:]:
if X&Y:
continue
for i in range(N):
if X>>i&1:
for j in range(N):
if Y>>j&1:
dp[X|Y][i if S[i][j] else j] += dp[X][i] * dp[Y][j] * 2
k += 1
for i in range(N):
print(dp[-1][i])
sotanishy