많은 응용에서 질 좋은 난수가 필요하고, 암호학에서 특히 그렇다. 진짜 무작위성의 원천으로 방사성 붕괴를 쓰기도 하지만 이 방법은 난수를 얻는 속도가 느리다. 같은 "난수" 수열을 서로 떨어진 두 곳에서 똑같이 만들어야 하는 경우도 많다. 그래서 의사 난수 수열을 대신 쓴다. 의사 난수 수열은 사실 난수가 아니지만 진짜 난수 수열과 구별하기가 매우 어렵다. 예측하기도 어려워야 한다. 앞의 몇 개를 알아도 아직 보지 못한 뒤쪽 원소를 알아내기 어려워야 한다는 뜻이다.
암호기계협회(ACM)가 의사 난수 수열을 만드는 알고리즘을 고안했지만 성능이 어느 정도인지는 아무도 모른다. 이 알고리즘을 검증해 보자.
알고리즘이 내놓는 원소는 모두 0 이상 B−1 이하의 정수이고, 절차는 다음과 같다.
B=10이고 씨앗이 845이면 수는 845, 129, 311(1+2=3, 2+9=11), 42(3+1=4, 1+1=2), 6(4+2=6) 순으로 바뀐다. 마지막 수는 한 자리이므로 알고리즘이 멈춘다. 이때 나온 의사 난수는 5, 9, 1, 2, 6이다.
검증은 이렇게 한다. 생성기가 내놓은 앞 L개 원소와 L보다 큰 정수 T가 주어진다. 앞 L개 원소가 앞 T개 원소를 완전히 정하는지 판단하면 된다. 주어진 L개 원소를 만드는 씨앗 가운데 원소를 T개보다 적게 내놓는 것이 하나라도 있으면 앞 T개 원소는 정해지지 않은 것이다. ACM은 검증 절차가 얼마나 튼튼한지 보려고 어떤 씨앗으로도 만들 수 없는 수열도 몇 개 섞어 두었다.
첫 줄에 테스트 케이스의 개수 N이 주어진다. 각 테스트 케이스는 세 줄이다. 첫 줄에는 진법 B가 주어진다(2≤B≤1000). 둘째 줄에는 정수 L(1≤L≤100)과 어떤 수열의 앞 L개 원소가 주어진다. 원소는 10진법으로 적으며 모두 0 이상 B−1 이하이다. 셋째 줄에는 예측할 원소의 위치 T가 주어진다(L<T≤100000).
각 테스트 케이스마다 한 줄씩 출력한다.
impossibleunpredictable