F - Chebyshev Cafe 解説
by
sounansya
0-indexed で考えます。\(C_{r,c}=(A_r\times B_c) \bmod M\) とします。
\(\displaystyle f(i,j)=\sum_{r=0}^{N-1} \sum_{c=0}^{N-1} C_{r,c}\max(|i-r|,|j-c|)=\sum_{r=0}^{N-1} \sum_{c=0}^{N-1} C_{r,c}\frac{|(r+c)-(i+j)|+|(r-c)-(i-j)|}2\) です。
\(\displaystyle \sum_{r=0}^{N-1} \sum_{c=0}^{N-1} C_{r,c} |(r+c)-(i+j)|\) は \(r+c=k\) を満たす \((r,c)\) 全てに対する \(C_{r,c}\) の総和を各 \(k\) に対して計算しておくことで高速に計算することができます。\(\displaystyle \sum_{r=0}^{N-1} \sum_{c=0}^{N-1} C_{r,c} |(r-c)-(i-j)|\) に関しても同様です。
以上を適切に実装することでこの問題に正答することができます。
n, m = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
u = [0] * (2 * n - 1)
v = [0] * (2 * n - 1)
for i in range(n):
for j in range(n):
w = A[i] * B[j] % m
u[i + j] += w
v[i - j + n - 1] += w
def calc(a):
res = [0] * len(a)
s = t = 0
for i, x in enumerate(a):
res[i] += i * s - t
s += x
t += i * x
s = t = 0
for i in range(len(a) - 1, -1, -1):
res[i] += t - i * s
s += a[i]
t += i * a[i]
return res
u = calc(u)
v = calc(v)
ans = 0
for i in range(n):
for j in range(n):
ans ^= (u[i + j] + v[i - j + n - 1]) // 2 + i * n + j
print(ans)
投稿日時:
最終更新:
