만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

고양이 구스와 무작위 행렬

시간 제한3초메모리 제한1024 MB

요약
0부터 p-1까지의 난수로 채워진 n×m 표에서 합이 p로 나누어떨어지는 부분 직사각형 중 합이 가장 큰 것을 구합니다.
난이도

어려움10점 중 8점

유형
행렬, 누적 합, 해시맵, 수학
정답자
아직 제출이 없습니다

문제

고양이 구스는 닉 퓨리를 위해 크기가 n×mn \times m인 직사각형 표 aa를 준비했다. 표의 각 칸에는 00부터 p−1p-1까지의 정수가 들어 있다.

닉 퓨리는 표의 모든 수가 00부터 p−1p-1까지의 수 중에서 서로 독립적으로, 같은 확률로 무작위 선택되었다는 것을 바로 알아챘다.

표에서 원소의 합이 pp로 나누어떨어지는 직사각형 부분행렬을 찾으세요. 그런 부분행렬 중 합이 최대인 것을 구해야 합니다. 형식적으로는 1≤i1≤i2≤n1 \leq i_1 \leq i_2 \leq n, 1≤j1≤j2≤m1 \leq j_1 \leq j_2 \leq m을 만족하고, i1≤x≤i2i_1 \leq x \leq i_2, j1≤y≤j2j_1 \leq y \leq j_2에 대한 ax,ya_{x,y}의 합이 pp로 나누어떨어지며, 그 합이 최대인 부분행렬을 찾습니다.

입력

첫 줄에 세 정수 nn, mm, pp (1≤n⋅m,p≤1 000 0001 \leq n \cdot m, p \leq 1\,000\,000)가 주어진다. 각각 표의 크기와, 부분행렬의 합이 나누어떨어져야 하는 수다.

이어서 nn개의 줄에 각각 mm개의 정수가 주어진다. ii번째 줄의 jj번째 수는 ai,ja_{i,j}다 (0≤ai,j≤p−10 \leq a_{i,j} \leq p - 1).

aa의 각 수는 서로 독립적으로, 00부터 p−1p-1까지 중에서 같은 확률로 무작위 선택되었다고 보장된다.

출력

합이 pp로 나누어떨어지는 직사각형 부분행렬의 합 중 최대값을 정수 하나로 출력한다. 그런 부분행렬이 없으면 00을 출력한다.

예제1

  1. 예제 1

    입력
    6 7 5
    0 0 3 0 1 0 4
    0 2 3 0 2 2 1
    2 4 1 4 4 0 3
    1 1 0 2 0 3 2
    3 0 3 1 0 1 2
    1 2 0 0 3 3 1
    
    예상 출력
    65