1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
for T in range(int(input())):
s, p, q, m = map(int, input().split())
V = s
visited = [0]*m
i = 1
while True:
V = (p*V + q) % m
i += 1
if visited[V] != 0:
result = i - visited[V]
break
visited[V] = i
print(f'#{T+1} {result}')
# 한 번 나왔던 숫자의 '위치 정보(i)'를
# visited에 저장해 두었다가
# 한 번이라도 방문했던 숫자가 나왔을 때
# 저장해주었던 '위치 정보'의 차리를 계산해 준다.
# 코딩중.
# 만약 [6,8,6,4,3,5,4,3,5,4,3,5...] 경우가 있을 수 있나? 는 고민으로
# 시간을 썼으나.
# 문제 조건 중
# 슈도랜덤 제너레이터의 주기란,
# 어떤 정수 n0 이상인 '모든 n에 대해' An+p = An을 만족하는 가장 작은 자연수 p
# 라는 내용을 보고, 반복되는 수의 등장은 동일 배열 순환의 시작이라고 파악해야 했다.
|