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)|\) に関しても同様です。

以上を適切に実装することでこの問題に正答することができます。

実装例(Python3)

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)

投稿日時:
最終更新: