만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

괄호

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

요약
길이 n인 괄호 문자열을 뒤집고 반전하는 연산의 최소 횟수로 세어, 그 가중합을 m으로 나눈 나머지를 구합니다.
난이도

어려움10점 중 9점

유형
조합론, 수학, 동적 계획법
정답자
아직 제출이 없습니다

문제

올바른 괄호 문자열은 다음 규칙으로 재귀적으로 정의한다.

  • 빈 문자열은 올바른 괄호 문자열이다.
  • XX와 YY가 올바른 괄호 문자열이면, XYX Y (XX와 YY를 이어 붙인 문자열)도 올바른 괄호 문자열이다.
  • XX가 올바른 괄호 문자열이면, ‘(‘X‘)‘`(`X`)`도 올바른 괄호 문자열이다.

모든 올바른 괄호 문자열은 위 규칙을 반복 적용하여 만들 수 있다.

괄호 문자열에 대해 다음 연산을 수행할 수 있다.

  • 매번 L≤RL \le R을 만족하는 두 인덱스 LL, RR을 고른다. 이 연산은 LL부터 RR까지(양 끝 포함) 인덱스의 문자를 수정한다.
  • 먼저 이 문자들의 순서를 뒤집는다.
  • 그다음 각 문자를 반대 문자로 바꾼다. 즉, 구간 안의 '('는 ')'가 되고, ')'는 '('가 된다.

괄호 문자열의 값은 이를 올바른 괄호 문자열로 바꾸는 데 필요한 연산 횟수의 최솟값이다. 불가능하면 값은 1010010^{100}이다.

예를 들어, "()(("의 값은 11이고, "()()"의 값은 00이며, "((("의 값은 1010010^{100}이다.

정수 nn이 주어진다. 각 1≤i≤n1 \le i \le n에 대해, 길이가 nn이고 값이 ii인 서로 다른 괄호 문자열의 개수 AiA_i를 구한 뒤, ∑i=0n((i+1)⋅Ai)\sum_{i = 0}^{n} ((i + 1) \cdot A_i)의 값을 계산하라.

답이 매우 클 수 있으므로, 주어진 정수 mm으로 나눈 나머지를 출력한다.

입력

첫째 줄에 두 정수 nn, mm (1≤n≤1061 \le n \le 10^6, 1≤m≤1091 \le m \le 10^9)이 주어진다.

출력

답을 한 정수로 출력한다.

예제2

  1. 예제 1

    입력
    1 100
    
    예상 출력
    0
    
  2. 예제 2

    입력
    10 100
    
    예상 출력
    68