結果
| 問題 | No.3486 Draw a Rainbow |
| コンテスト | |
| ユーザー |
👑 AngrySadEight
|
| 提出日時 | 2025-12-16 21:53:34 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 2,758 ms / 4,000 ms |
| コード長 | 1,350 bytes |
| 記録 | |
| コンパイル時間 | 187 ms |
| コンパイル使用メモリ | 85,248 KB |
| 実行使用メモリ | 139,388 KB |
| 最終ジャッジ日時 | 2026-03-27 20:51:43 |
| 合計ジャッジ時間 | 22,065 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
mod = 998244353
def fzt(lst, N):
ret_lst = lst
for i in range(N):
for j in range(1 << N):
if not (j >> i) & 1:
ret_lst[j + (1 << i)] += ret_lst[j]
ret_lst[j + (1 << i)] %= mod
return ret_lst
def fmt(lst, N):
ret_lst = lst
for i in range(N):
for j in range(1 << N):
if (j >> i) & 1:
ret_lst[j] -= ret_lst[j - (1 << i)]
ret_lst[j] %= mod
return ret_lst
def or_convolution(f, g, N):
fw = fzt(f, N)
gw = fzt(g, N)
hw = [(fw[i] * gw[i]) % mod for i in range(1 << N)]
h = fmt(hw, N)
return h
N, M, L = map(int, input().split())
A = []
B = []
for _ in range(N):
a, b = map(int, input().split())
A.append(a - 1)
B.append(b - M - 1)
pow_2 = [1]
for _ in range(N):
prev_2 = pow_2[-1]
pow_2.append((prev_2 * 2) % mod)
cnts = [[0 for _ in range(L)] for _ in range(M)]
for i in range(N):
cnts[A[i]][B[i]] += 1
ans_l = [0 for _ in range(1 << L)]
ans_l[0] = 1
for i in range(M):
g_l = [0 for _ in range(1 << L)]
for j in range(1, 1 << L):
sub = 1
for k in range(L):
if (j >> k) & 1:
sub = (sub * (pow_2[cnts[i][k]] - 1)) % mod
g_l[j] = sub
ans_l_new = or_convolution(ans_l, g_l, L)
ans_l = ans_l_new
print(ans_l[-1])
AngrySadEight