부분행렬 최댓값의 합

두 배열로 생성한 N by N 행렬의 모든 K by K 부분행렬에서 최댓값의 합을 구합니다.

보통5슬라이딩 윈도우행렬면접 대비아직 제출이 없습니다시간 제한20초메모리 제한1024 MB

문제

음이 아닌 정수로 이루어진 N×NN \times N 행렬 MM이 있다. MM 안에 들어 있는 모든 K×KK \times K 부분행렬마다 그 안의 최댓값을 하나씩 골라 목록을 만든 다음, 목록에 있는 값을 전부 더한 값을 구하려고 한다. 부분행렬끼리는 서로 겹칠 수 있으므로 목록의 길이는 (NK+1)2(N-K+1)^2이다. 같은 칸이 여러 부분행렬에서 동시에 최댓값이 되면 그 값은 목록에 여러 번 들어간다.

행렬을 그대로 입력하면 크기가 너무 커지므로, 길이가 NN인 배열 AABB, 그리고 정수 CCXX가 대신 주어진다. ii번째 행 jj번째 열의 값 MijM_{ij}는 다음과 같이 정한다.

Mij=(Ai×i+Bj×j+C)modXM_{ij} = (A_i \times i + B_j \times j + C) \bmod X

iijj는 모두 1 이상 NN 이하이다.

입력

첫 줄에 테스트 케이스의 개수 TT가 주어진다. 이어서 TT개의 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 줄에는 네 정수 NN, KK, CC, XX가 공백으로 구분되어 주어진다. 다음 두 줄에는 각각 정수가 NN개씩 주어지는데, 첫 줄이 배열 AA이고 둘째 줄이 배열 BB이다.

출력

각 테스트 케이스마다 한 줄에 Case #x: y 형식으로 출력한다. xx는 1부터 시작하는 테스트 케이스 번호이고, yy는 모든 K×KK \times K 부분행렬의 최댓값을 더한 값이다.

제한

  • 1T1001 \le T \le 100
  • 1N30001 \le N \le 3000
  • 1KN1 \le K \le N
  • 1Ai,Bi1000001 \le A_i, B_i \le 100000
  • 1C1000001 \le C \le 100000
  • 1X10000000071 \le X \le 1000000007

힌트

예제의 첫 번째 테스트 케이스에서 행렬은 다음과 같다.

3

K=1K = 1이라 부분행렬이 하나뿐이므로 답은 3이다.

두 번째 테스트 케이스의 행렬은 다음과 같다.

9 3
1 6

K=1K = 1이므로 네 칸이 각각 부분행렬이 되고, 답은 9+3+1+6=199 + 3 + 1 + 6 = 19이다.

세 번째 테스트 케이스의 행렬은 다음과 같다.

11 11 24
13 13 26
14 14 27

K=2K = 2인 부분행렬은 네 개이고 최댓값은 각각 13, 26, 14, 27이므로 답은 80이다.