만드는 중입니다

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

Xorshift+ 예측

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

요약
알려진 시프트 값으로 만들어진 xorshift+ 형태의 난수 생성기에서 연속된 K개의 출력을 보고 다음 반환값을 구합니다.
난이도

보통10점 중 7점

유형
비트 연산, 수학, 행렬
정답자
아직 제출이 없습니다

문제

다음과 같은 의사 난수 생성기를 생각해 보자.

  function xorshift()
    last_value = internal_value
    for i = 1 to M do
      if S[i] < 0 then
        internal_value = internal_value ^ (internal_value >> -S[i])
      else
        internal_value = internal_value ^ (internal_value << S[i])
    return last_value + internal_value

여기서

  • last_value는 NN비트 지역 변수이다.
  • internal_value는 NN비트 전역 변수이며, 초깃값은 알려져 있지 않다.
  • S는 값을 알고 있는 MM개 원소의 전역 상수 배열이다.
  • ^는 비트 단위 배타적 논리합(XOR)이다. 결과의 각 비트는 두 피연산자의 대응하는 비트가 같으면 00, 다르면 11이다. 예를 들어 10‘‘12=610 \mathbin{`^`} 12 = 6이다. 10의 이진수는 1010, 12의 이진수는 1100이므로 결과는 0110, 곧 6의 이진수이다.
  • <<와 >>는 비트 단위 왼쪽 시프트와 오른쪽 시프트이다. NN비트 수를 ss비트만큼 왼쪽으로 시프트하면 가장 왼쪽의 ss개 비트가 지워지고 오른쪽에 ss개의 00 비트가 붙는다. 예를 들어 4비트 변수에서 6‘<<‘2=86 \mathbin{`<<`} 2 = 8이다. 6의 이진수 0110에서 왼쪽 두 비트를 지우면 10이고, 오른쪽에 00 비트 두 개를 붙이면 1000, 곧 8의 이진수이다. 오른쪽 시프트는 오른쪽에서 비트를 지우고 왼쪽에 비트를 붙인다.
  • +는 덧셈이며, 결과에서는 가장 오른쪽 NN비트만 사용한다.
  • internal_value의 초깃값은 00이 아니며, S의 값은 xorshift를 무한히 호출하면 internal_value가 1…2N−11 \ldots 2^N-1의 모든 값을 가지도록 정해져 있다.

위의 xorshift 함수를 KK번 연속으로 호출하여 얻은 반환값 KK개를 입력받아, 그다음 호출에서 반환될 값을 구하는 프로그램을 작성하시오.

입력

입력 파일의 첫 줄에 세 정수 NN (2≤N≤642 \le N \le 64), MM (2≤M≤102 \le M \le 10), KK (100≤K≤200 000100 \le K \le 200\,000)가 주어진다. 둘째 줄에는 MM개의 정수 SiS_i (1−N≤Si≤N−11-N \le S_i \le N-1)가 주어진다. 셋째 줄에는 xorshift 함수를 KK번 연속으로 호출했을 때의 반환값인 KK개의 정수 VjV_j (1≤Vj<2N1 \le V_j < 2^N)가 주어진다.

출력

출력 파일의 한 줄에 xorshift 함수의 다음 호출에서 반환되는 값을 정수 하나로 출력한다.

예제1

  1. 예제 1

    입력
    2 2 100
    -1 1
    0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0 1 3 0
    
    예상 출력
    1