행렬 연산
시간 제한2초메모리 제한512 MB
N x N 행렬에 쓰기, 복사, 행/열 교환, 회전, 반사 연산을 순서대로 적용한 뒤 마지막 행렬의 일부 영역으로 해시 값을 계산한다.
문제
당신은 취업 준비생이다. 오늘 IT 기업의 입사 시험을 봤다. 시험에서는 여러 연산을 효율적으로 수행하는 프로그램을 작성하라는 요구를 받았다. 먼저 정사각 행렬과 연산 목록이 주어진다. 한 가지를 제외한 모든 연산은 행렬을 변경하고, 마지막 연산은 지정된 칸의 문자를 출력한다. 모든 연산을 마친 뒤의 최종 행렬을 출력해야 한다는 점을 기억하자.
연산의 세부 사항은 다음과 같다.
- WR r c v: (Write 연산) 칸 (r,c)에 정수 v를 쓴다 ()
- CP r1 c1 r2 c2: (Copy 연산) 칸 (r1,c1)의 문자를 칸 (r2,c2)로 복사한다
- SR r1 r2: (Swap Row 연산) r1번째 행과 r2번째 행을 교환한다
- SC c1 c2: (Swap Column 연산) c1번째 열과 c2번째 열을 교환한다
- RL: (Rotate Left 연산) 전체 행렬을 반시계 방향으로 90도 회전한다
- RR: (Rotate Right 연산) 전체 행렬을 시계 방향으로 90도 회전한다
- RH: (Reflect Horizontal 연산) 행의 순서를 뒤집는다
- RV: (Reflect Vertical 연산) 열의 순서를 뒤집는다
입력
각 테스트케이스의 첫째 줄에는 정수 아홉 개가 주어진다. 이 줄의 처음 두 정수 N과 Q는 각각 행렬의 크기와 쿼리의 수를 나타낸다 . 다음 세 정수 A, B, C는 초기 행렬의 값을 계산하는 계수이며 , 다음과 같이 사용된다: . 여기서 r과 c는 각각 행과 열의 인덱스이다 . 마지막 네 정수 D, E, F, G는 다음 절에서 언급하는 최종 해시 값을 계산하는 계수이다 . 다음 Q개 줄에는 각각 위에서 설명한 형식의 연산이 하나씩 주어진다.
출력
다음 의사 코드로 최종 행렬 B에서 계산한 해시 값 h를 출력한다.
h <- 314159265
for r = D...E
for c = F...G
h <- (31 * h + B_{r,c}) mod 1,000,000,007
여기서 "<-"는 파괴적 대입 연산자이고, "for i = S...T"는 i가 S부터 T까지(양 끝 포함) 반복되는 루프를 나타내며, "mod"는 나머지 연산이다.