結果
| 問題 |
No.2977 Kth Xor Pair
|
| コンテスト | |
| ユーザー |
👑 tatyam
|
| 提出日時 | 2024-12-02 00:10:55 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 270 ms / 3,000 ms |
| コード長 | 1,701 bytes |
| コンパイル時間 | 366 ms |
| コンパイル使用メモリ | 81,792 KB |
| 実行使用メモリ | 117,100 KB |
| 最終ジャッジ日時 | 2024-12-02 00:11:05 |
| 合計ジャッジ時間 | 9,680 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 34 |
ソースコード
N, K = map(int, input().split())
K = (K - 1) * 2 + N
A = list(map(int, input().split()))
X = [0] * (1 << 17)
for a in A:
X[a >> 13] += 1
def FWT(X) -> None:
N = len(X)
n = N.bit_length() - 1
for i in range(n):
d = 1 << i
for j in range(N):
if (j & d) == 0:
x = X[j]
y = X[j | d]
X[j] = x + y
X[j | d] = x - y
def IFWT(X) -> None:
N = len(X)
n = N.bit_length() - 1
for i in range(n):
d = 1 << i
for j in range(N):
if (j & d) == 0:
x = X[j]
y = X[j | d]
X[j] = (x + y) >> 1
X[j | d] = (x - y) >> 1
def xor_conv(X, Y) -> list[int]:
N = len(X)
X = X[:]
Y = Y[:]
FWT(X)
FWT(Y)
for i in range(N):
X[i] *= Y[i]
IFWT(X)
return X
X = xor_conv(X, X)
for upper in range(1 << 17):
if X[upper] <= K:
K -= X[upper]
else:
break
B = [[] for _ in range(1 << 17)]
LO = (1 << 13) - 1
for a in A:
B[a >> 13].append(a & LO)
S = [0] * (1 << 13)
for i in range(1 << 17):
j = upper ^ i
if len(B[i]) == 0 or len(B[j]) == 0:
continue
if len(B[i]) * len(B[j]) <= 13 << 13:
for a in B[i]:
for b in B[j]:
S[a ^ b] += 1
else:
X = [0] * (1 << 13)
for a in B[i]:
X[a] += 1
Y = [0] * (1 << 13)
for b in B[j]:
Y[b] += 1
Z = xor_conv(X, Y)
for k in range(1 << 13):
S[k] += Z[k]
for lower in range(1 << 13):
if S[lower] <= K:
K -= S[lower]
else:
break
print(upper << 13 | lower)
tatyam