아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

잠긴 상자

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

요약
W와 E로 이루어진 연산 문자열에 추가, 뒤집기, 순서 뒤집기 업데이트가 들어올 때마다 연분수 값을 기약분수로 구해 998244353으로 나눈 나머지를 출력합니다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 행렬, 수학
정답자
아직 제출이 없습니다

문제

잠긴 상자의 비밀번호는 수열 {an}\{a_n\}로 정해진다. 수열은 다음과 같이 만든다.

  1. 처음에 수열의 길이는 2이고, a0=0a_0 = 0, a1=1a_1 = 1이다.

  2. 수열에 연산을 여러 번 수행한다. 각 연산은 다음 두 종류 중 하나이다.

    • 종류 W: 수열의 마지막 항에 1을 더한다.
    • 종류 E: 마지막 항이 1이면 마지막에서 두 번째 항에 1을 더한다. 그렇지 않으면 마지막 항에서 1을 빼고, 수열 끝에 항 두 개를 붙인다. 붙인 두 항의 값은 모두 1이다.

상자는 수열 전체를 확인할 수 없으므로, 비밀번호는 함수 ff로 변환한 뒤의 {an}\{a_n\} 값으로 정한다. 함수 ff는 다음과 같다.

f(a0,…,ak−1,ak)={a0,k=0f(a0,a1,…,ak−2,ak−1+1ak),k≥1f(a_0,\dots,a_{k-1},a_k) = \begin{cases} a_0, & k = 0 \\ f\left(a_0,a_1,\dots,a_{k-2},a_{k-1}+\frac{1}{a_k}\right), & k \ge 1 \end{cases}

비밀번호는 연산 순서로부터 계산한다. 연산 순서는 갱신으로 바뀔 수 있다. 갱신은 다음 세 종류 중 하나이다.

  • APPEND c: 현재 연산 순서의 뒤에 종류 c의 연산을 덧붙인다. c는 W 또는 E이다.
  • FLIP l r: 현재 연산 순서에서 ll번째부터 rr번째 연산까지(양 끝 포함) 반전한다. 반전은 W를 E로, E를 W로 바꾸는 것이다.
  • REVERSE l r: ll번째부터 rr번째 연산까지의 순서를 거꾸로 뒤집는다.

입력

첫 줄에 초기 연산 순서의 길이 nn과 갱신 횟수 qq가 주어진다. 둘째 줄에는 대문자 E와 W로만 이루어진 길이 nn의 문자열이 주어지며, 이것이 초기 연산 순서이다. 이어지는 qq개의 줄에는 위에서 설명한 형식의 갱신이 한 줄에 하나씩 주어진다.

출력

q+1q+1개의 줄을 출력한다. 첫 줄에는 초기 연산 순서에 대한 비밀번호를, 이어지는 qq개의 줄에는 각 갱신 후의 비밀번호를 출력한다. 각 줄에는 정수 두 개를 출력한다. 비밀번호가 ab\frac{a}{b}이고 a,b>0a, b > 0, gcd⁡(a,b)=1\gcd(a,b) = 1이면, aa와 bb를 각각 998244353으로 나눈 나머지를 출력한다. 비밀번호는 항상 양의 유리수이다.

제한

모든 테스트케이스에서 1≤n≤1051 \le n \le 10^5, 1≤q≤1051 \le q \le 10^5이다.

APPEND 갱신의 cc는 항상 대문자 W 또는 E이다.

FLIP과 REVERSE 갱신에서는 1≤l≤r≤L1 \le l \le r \le L이 보장된다. 여기서 LL은 현재 연산 순서의 길이이다.

APPEND 갱신 때문에 연산 순서의 길이는 최대 2×1052 \times 10^5까지 늘어날 수 있다.

힌트

연산{an}\{a_n\}비밀번호
초기WE(0,1,1,1)(0,1,1,1)23\frac{2}{3}
첫 번째 갱신 후WEE(0,1,2,1)(0,1,2,1)34\frac{3}{4}
두 번째 갱신 후EWE(1,1,1,1)(1,1,1,1)53\frac{5}{3}
세 번째 갱신 후EEW(2,2)(2,2)52\frac{5}{2}

예제1

  1. 예제 1

    입력
    2 3
    WE
    APPEND E
    FLIP 1 2
    REVERSE 2 3
    
    예상 출력
    2 3
    3 4
    5 3
    5 2