AOJ_2149 Luck Manipulator

問題

解法
線形合同法を使って疑似乱数を実際に生成しシミュレーションするだけでいい。

実装

#include <cstdio>
#include <algorithm>
using namespace std;

int A, B, C;
int nX;
const int MAX_N = 100;
int N, num[MAX_N];

void rng(){
		nX = ((A * nX) % C + B) % C;
}
int main(){
	while(scanf("%d %d %d %d %d", &N, &A, &B, &C, &nX)){
		if(N == A && A == B && B == C && C == nX && nX == 0)
			return 0;
		A = A % C; B = B % C;
		for(int i = 0; i < N; i++){
				scanf("%d", &num[i]);
		}
		bool f = false;
		int cnt = 0;
		for(int i = 0; i <= 10000; i++){
			if(num[cnt] == nX){
				if(cnt == N - 1){
					printf("%d\n", i);
					f = true;
					break;
				}
				cnt++;
			}
			rng();
		}
		if(!f)
			printf("-1\n");
	}
	return 0;
}