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

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

피보나치 기계

시간 제한2초메모리 제한512 MB

요약
구간 증가 연산과, 각 레지스터 값을 피보나치 수의 첨자로 본 합을 구간마다 질의하는 문제를 10^9+7로 나눈 값으로 답한다.
난이도

어려움10점 중 8점

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

문제

피보나치 수는 다음과 같이 정의된다.

  • F(0)=0F(0) = 0
  • F(1)=1F(1) = 1
  • m≥2m \ge 2 일 때 F(m)=F(m−1)+F(m−2)F(m) = F(m-1) + F(m-2)

피보나치 기계는 정수 레지스터 nn개로 이루어진 수열 ⟨i1,i2,…,in⟩\langle i_1, i_2, \dots, i_n \rangle 을 관리하며, 처음에는 모든 레지스터가 00이다. 이 기계는 두 가지 연산을 제공한다.

  • 더하기: 구간 [a,b][a, b] 에 속한 모든 레지스터에 11을 더한다. 즉 ia,ia+1,…,ibi_a, i_{a+1}, \dots, i_b 를 각각 11씩 증가시킨다.
  • 합: 구간 [a,b][a, b] 에 속한 레지스터 값을 색인으로 하는 피보나치 수들의 합, 즉 F(ia)+F(ia+1)+⋯+F(ib)F(i_a) + F(i_{a+1}) + \dots + F(i_b) 를 구한다.

피보나치 기계를 시뮬레이션하는 프로그램을 작성하라.

입력

첫 번째 줄에 레지스터의 개수 nn과 연산의 개수 kk가 공백으로 구분되어 주어진다 (1≤n,k≤1000001 \le n, k \le 100000). 이어지는 kk개의 줄에는 각각 하나의 연산이 주어지며, 문자 하나와 두 정수 aa, bb (1≤a≤b≤n1 \le a \le b \le n)로 구성된다.

  • D a b 는 구간 [a,b][a, b] 에 더하기 연산을 수행한다.
  • S a b 는 구간 [a,b][a, b] 에 합 연산을 수행한다.

합 연산 S 는 적어도 한 번 이상 주어진다.

출력

각 S 연산마다 구한 피보나치 수들의 합을 109+710^9 + 7 로 나눈 나머지를 한 줄에 하나씩 출력한다.

참고

예시에서 마지막 질의를 수행하는 시점의 레지스터는 ⟨1,3,4,3,2⟩\langle 1, 3, 4, 3, 2 \rangle 이므로, S 2 3 의 결과는 F(3)+F(4)=2+3=5F(3) + F(4) = 2 + 3 = 5 이다.

예제4

  1. 예제 1

    입력
    5 7
    D 1 4
    S 1 5
    D 3 5
    D 2 3
    S 1 5
    D 2 5
    S 2 3
    
    예상 출력
    4
    6
    5
    
  2. 예제 2

    입력
    1 4
    D 1 1
    D 1 1
    D 1 1
    S 1 1
    
    예상 출력
    2
    
  3. 예제 3

    입력
    3 1
    S 1 3
    
    예상 출력
    0
    
  4. 예제 4

    입력
    4 2
    D 1 4
    S 1 4
    
    예상 출력
    4