결국 주기적인 수열

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

요약
N, 시작값 n, 후위 표기법으로 주어진 함수 f가 있을 때 x를 f(x) mod N으로 반복 적용하며 결국 반복되는 주기의 길이를 구한다.
난이도

보통10점 중 7점

유형
수학, 시뮬레이션, 구현, 해시맵
정답자
아직 제출이 없습니다

문제

음이 아닌 정수 NN 에 대하여 함수 f ⁣:{0,1,…,N}→{0,1,…,N}f\colon \{0, 1, \dots, N\} \to \{0, 1, \dots, N\} 가 주어지고, n≤Nn \le N 인 음이 아닌 정수 nn 이 주어진다. 이를 이용해 다음과 같이 무한 수열 F=f1(n),f2(n),…,fk(n),…F = f^{1}(n), f^{2}(n), \dots, f^{k}(n), \dots 을 만들 수 있다. 여기서 fk(n)f^{k}(n) 은 f1(n)=f(n)f^{1}(n) = f(n), fk+1(n)=f(fk(n))f^{k+1}(n) = f(f^{k}(n)) 으로 재귀적으로 정의된다.

이렇게 만든 수열 FF 는 항상 결국 주기적이다. 즉, 어느 지점 이후로는 같은 구간이 반복된다. 예를 들어 1,2,7,5,4,6,5,4,6,5,4,6,…1, 2, 7, 5, 4, 6, 5, 4, 6, 5, 4, 6, \dots 와 같다.

N≤11000000N \le 11000000, n≤Nn \le N, 그리고 함수 ff 가 주어질 때 수열 FF 의 주기를 구하여라.

입력

입력의 각 줄에는 NN, nn, 그리고 함수 ff 를 후위 표기법(역폴란드 표기법, RPN)으로 나타낸 식이 주어진다. 피연산자는 부호 없는 정수 상수, 문자 NN, 또는 변수 xx 중 하나이다. 연산자는 이항 연산자만 허용되며 ++ (덧셈), \*\* (곱셈), %\% (나머지, 즉 정수 나눗셈의 나머지) 세 가지이다. 피연산자와 연산자는 공백으로 구분된다. %\% 연산자는 각 함수에서 정확히 한 번만 나타나며, 항상 가장 마지막(가장 오른쪽, 즉 가장 위쪽) 연산자이고 그 두 번째 피연산자는 언제나 입력으로 주어진 NN 이다. 예를 들어 다음 후위 표기식

2 x * 7 + N %

은 익숙한 중위 표기 (2\*x+7)%N(2 \* x + 7) \% N 에 해당한다. 모든 입력 줄의 길이는 100자 미만이다. 입력의 마지막 줄은 N=0N = 0 이며, 이 줄은 처리하지 않는다.

출력

입력의 각 줄마다 한 줄에 정수 하나를 출력한다. 그 값은 해당 입력 줄의 데이터로 만든 수열 FF 의 주기이다.

예제1

  1. 예제 1

    입력
    10 1 x N %
    11 1 x x 1 + * N %
    1728 1 x x 1 + * x 2 + * N %
    1728 1 x x 1 + x 2 + * * N %
    100003 1 x x 123 + * x 12345 + * N %
    0 0 0 N %
    
    예상 출력
    1
    3
    6
    6
    369