結果
| 問題 |
No.3285 Chorus with Friends
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-09-22 21:08:02 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 1,874 bytes |
| コンパイル時間 | 483 ms |
| コンパイル使用メモリ | 82,408 KB |
| 実行使用メモリ | 251,452 KB |
| 最終ジャッジ日時 | 2025-09-22 21:08:08 |
| 合計ジャッジ時間 | 5,253 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 30 RE * 10 |
ソースコード
# -*- coding: utf-8 -*-
import sys
MOD = 998244353
def solve():
input_data = sys.stdin.read().strip().split()
it = iter(input_data)
N = int(next(it)); M = int(next(it))
A = [[0]*M for _ in range(N)]
for i in range(N):
for j in range(M):
A[i][j] = int(next(it))
first_vals = set(A[i][0] for i in range(N))
ans = 0
for v in first_vals:
# P_j: set of p in 0..M-1 such that A[j][p+1] == v (p corresponds to column index p+1)
P = [set() for _ in range(N)]
for j in range(N):
for k in range(M):
if A[j][k] == v:
P[j].add(k) # k corresponds to p = k (because A[j][k] == v means column k+1)
# initial mask: bit j = 1 iff 0 in P_j (i.e. A[j][1] == v)
init_mask = 0
for j in range(N):
if 0 in P[j]:
init_mask |= (1 << j)
dp = [0] * (1 << N)
dp[init_mask] = 1
# steps i = 1..M
for i in range(1, M+1):
ndp = [0] * (1 << N)
for mask in range(1 << N):
ways = dp[mask]
if ways == 0:
continue
# choose any j with mask's bit = 1
for j in range(N):
if (mask >> j) & 1:
if i < M:
# after picking at step i, bit j becomes (i in P_j)
newbit = 1 if i in P[j] else 0
newmask = (mask & ~(1 << j)) | (newbit << j)
else:
# i == M: no update happens after final pick
newmask = mask
ndp[newmask] = (ndp[newmask] + ways) % MOD
dp = ndp
ans = (ans + sum(dp)) % MOD
print(ans % MOD)
if __name__ == "__main__":
solve()