結果
| 問題 | No.3768 Sum of Difference of XOR |
| コンテスト | |
| ユーザー |
apricity
|
| 提出日時 | 2026-07-04 04:59:31 |
| 言語 | PyPy3 (8.0.0 + ACL) |
| 結果 |
TLE
不安定
|
| 実行時間 | - |
| コード長 | 2,349 bytes |
| 記録 | |
| コンパイル時間 | 84 ms |
| コンパイル使用メモリ | 64,828 KB |
| 実行使用メモリ | 932,564 KB |
| 最終ジャッジ日時 | 2026-10-16 20:52:07 |
| 合計ジャッジ時間 | 100,198 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge4_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 9 TLE * 12 |
ソースコード
#!/usr/bin/env pypy3
MOD = 998244353
def fhwt(a, inv=False):
n = len(a)
assert (n&(n-1)) == 0
i = 1
while i < n:
for j in range(0,n,i<<1):
for k in range(0,i):
s,t = a[j+k], a[j+k+i]
a[j+k] = s+t
a[j+k+i] = s-t
i <<= 1
if inv:
for i in range(n):
a[i] //= n
def bitwise_xor_convolution(a, b):
n = len(a)
assert (n&(n-1)) == 0
assert len(b) == n
_a = a[:]
_b = b[:]
fhwt(_a); fhwt(_b)
for i in range(n):
_a[i] *= _b[i]
fhwt(_a, inv=True)
return _a
B = 18
MX = 1<<B
n = int(input())
a = list(map(int, input().split()))
f = [0 for _ in range(MX)]
for i in range(n):
f[a[i]] += 1
ff = bitwise_xor_convolution(f,f)
ans_sum = 0
for x in range(MX):
ans_sum += x*ff[x]*(n-2)*(n-3)*2
ans_sum %= MOD
sum_f = [0 for _ in range(MX+1)]
sum_fi = [0 for _ in range(MX+1)]
for i in range(MX):
sum_f[i+1] = sum_f[i] + ff[i]
sum_fi[i+1] = sum_fi[i] + ff[i]*i
ans_min = 0
for x in range(MX):
ans_min += ff[x] * (x*(sum_f[MX]-sum_f[x]) + sum_fi[x])
ans_min += 2*x*ff[x]
ans_min %= MOD
ax = [[[[0 for _ in range(2)] for _ in range(B)] for _ in range(2)] for _ in range(B)]
for i in range(n):
for j in range(B):
for k in range(B):
ax[j][a[i]>>j&1][k][a[i]>>k&1] += 1
ay = [[[0 for _ in range(2)] for _ in range(B)] for _ in range(MX*2)]
for i in range(n):
for j in range(B):
ay[MX+a[i]][j][a[i]>>j&1] += 1
b = [[0 for _ in range(2)] for _ in range(B)]
for x in range(MX):
for j in range(B):
b[j][x>>j&1] += f[x]*f[x]
for s in range(MX-1, 0, -1):
for i in range(B):
for j in range(2):
ay[s][i][j] += ay[s*2][i][j] + ay[s*2+1][i][j]
d = B - s.bit_length()
sz0 = ay[s*2][0][0] + ay[s*2][0][1]
sz1 = ay[s*2+1][0][0] + ay[s*2+1][0][1]
for i in range(B):
cnt = ax[d][1][i][0] * ay[s*2+1][i][1] + ax[d][1][i][1] * ay[s*2+1][i][0]
ans_min -= 4 * 2 * sz0 * cnt * (1<<i)
cnt = ax[d][0][i][0] * ay[s*2][i][1] + ax[d][0][i][1] * ay[s*2][i][0]
ans_min -= 4 * 2 * sz1 * cnt * (1<<i)
ans_min %= MOD
for i in range(n):
for j in range(B):
ans_min -= 4 * (b[j][1-(a[i]>>j&1)]) * (1<<j)
ans_min %= MOD
print((ans_sum - ans_min * 2) % MOD)
apricity