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

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

순열

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

요약
2n개 점 위의 부분 순열을 대합이면서 올바른 괄호열을 부호화하도록 채우는 경우의 수를 센다.
난이도

어려움10점 중 8점

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

문제

집합 M={1,2,3,…,m}M = \{1, 2, 3, \dots, m\} 위의 순열 pp란 일대일 대응 p:M→Mp : M \to M을 뜻한다. 순열 pp가 모든 i∈Mi \in M에 대해 p(p(i))=ip(p(i)) = i를 만족하면 pp를 대합(involution)이라고 부른다.

길이가 2n2n인 괄호 표현식이란 문자 (와 )만으로 이루어진 길이 2n2n짜리 문자열이다. 괄호 표현식이 올바르다(correct)는 것은, 여는 괄호 (의 개수와 닫는 괄호 )의 개수가 같고, 문자열의 모든 접두사에서 (의 개수가 )의 개수보다 작지 않다는 뜻이다.

순열 pp가 길이 2n2n인 괄호 표현식을 부호화한다(encode)는 것은 다음을 뜻한다. 여는 괄호들은 왼쪽에서 오른쪽 순서로 위치 p(1),p(2),…,p(n)p(1), p(2), \dots, p(n)에 있고, 닫는 괄호들도 왼쪽에서 오른쪽 순서로 위치 p(n+1),p(n+2),…,p(2n)p(n+1), p(n+2), \dots, p(2n)에 있다. 특히 이 경우 p(1)<p(2)<⋯<p(n)p(1) < p(2) < \dots < p(n)과 p(n+1)<p(n+2)<⋯<p(2n)p(n+1) < p(n+2) < \dots < p(2n)이 모두 성립한다.

pp의 값 중 일부가 이미 주어져 있다. 남은 값들을 채워서 pp가 대합이면서 어떤 올바른 괄호 표현식을 부호화하도록 만드는 방법의 수를 구하여라.

입력

표준 입력의 첫 줄에는 공백으로 구분된 두 정수 nn과 kk가 주어진다 (1≤n≤1061 \le n \le 10^6, 1≤k≤2n1 \le k \le 2n). 이어지는 kk개의 줄에는 각각 공백으로 구분된 정수 쌍이 주어진다. 그중 ii번째 줄에는 p(ai)=bip(a_i) = b_i임을 뜻하는 두 정수 aia_i와 bib_i가 있다 (1≤ai,bi≤2n1 \le a_i, b_i \le 2n). 모든 aia_i는 서로 다르고, 모든 bib_i도 서로 다르다.

출력

집합 {1,2,3,…,2n}\{1, 2, 3, \dots, 2n\}의 순열 중에서 대합이고, 어떤 올바른 괄호 표현식을 부호화하며, 모든 1≤i≤k1 \le i \le k에 대해 p(ai)=bip(a_i) = b_i를 만족하는 순열의 개수를 한 줄에 정수 하나로 출력한다.

힌트

첫 번째 예제에서 모든 조건을 만족하는 순열은 p=⟨1,2,4,3,5,6⟩p = \langle 1, 2, 4, 3, 5, 6 \rangle 하나뿐이며, 이 순열은 괄호 표현식 (()())를 부호화한다.

예제1

  1. 예제 1

    입력
    3 4
    1 1
    2 2
    4 3
    6 6
    
    예상 출력
    1