만드는 중입니다

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

토론 클럽 2

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

요약
원형으로 앉은 m명을 두 개의 연속된 구간으로 나눌 때, 모든 견해가 두 팀에 모두 나타나는 방법의 수를 구합니다.
난이도

보통10점 중 6점

유형
투 포인터, 슬라이딩 윈도우, 비트 연산, 배열
정답자
아직 제출이 없습니다

문제

다시 바이토키 토론 클럽을 방문한다. 이 클럽에는 2n2^n명의 회원이 있으며, 각 회원은 nn개의 기본 질문에 대한 자신의 의견을 밝혔다. 질문의 구체적인 문구는 중요하지 않다. 각 질문에는 두 가지 답 중 하나가 가능하다(예: 커피인가 차인가). 한 사람의 의견은 비트열로 나타낼 수 있으며, 이 비트열을 이진수로 읽으면 0부터 2n−12^n-1까지의 정수가 된다. 클럽에 같은 의견을 가진 회원은 두 명이 없다.

오늘 클럽 모임에 mm명의 회원이 참석했다. 각자 이미 둥근 테이블의 자리에 앉아 있다. 회원들은 주요 주제를 미리 준비하려고 두 팀으로 나뉘어 논의하려 한다. 혼란을 줄이기 위해 각 팀은 테이블에서 연속으로 앉은 회원들로 구성되어야 한다. 토론의 내실을 위해 각 팀에는 모든 의견이 빠짐없이 있어야 한다. 즉, 각 기본 질문과 가능한 각 답에 대해, 첫 번째 팀에 그 의견을 가진 회원이 있으면 두 번째 팀에도 반드시 그 의견을 가진 회원이 있어야 한다.

회원들을 두 팀으로 나누는 방법의 수를 구하는 프로그램을 작성하라.

입력

첫 번째 줄에 두 정수 nn과 mm이 주어진다(n≥2n \ge 2, m≥3m \ge 3). 각각 기본 질문의 수와 모임에 참석한 회원의 수이다. 두 번째 줄에는 테이블을 둘러싼 순서대로 0부터 2n−12^n-1 사이의 서로 다른 정수 mm개가 주어지며, 각 정수는 한 회원의 의견을 나타낸다.

출력

조건을 만족하는, 회원을 두 팀으로 나누는 방법의 수를 정수 하나로 출력한다.

제한

n≤30n \le 30

m≤min⁡(2n,2,000,000)m \le \min(2^n, 2{,}000{,}000)

예제1

  1. 예제 1

    입력
    4 5
    1 10 0 11 3
    
    예상 출력
    2