# 극장 좌석 import sys input = sys.stdin.readline def solution(): n = int(input().rstrip()) m = int(input().rstrip()) vip = [0] * (n+1) for _ in range(m): vip[int(input().rstrip())] = 1 dp = [0] * (n+1) dp[0] = 1 dp[1] = 1 for i in range(2, n+1): if vip[i] or vip[i-1]: dp[i] = dp[i-1] else: dp[i] = dp[i-1] + dp[i-2] print(dp[n]) return solution() """ 걸린 시간: 16분 시간 복잡도: n개의 dp 테이블을 채우면 되기 때문에 O(n)이다. 해설: dp[i]를 i번 좌석까지 왔을 때 경우의 수라고 하자. i에 같은 번호가 잘 앉거나, 옆으로 이동하거나 2가지의 경우가 있다. i가 잘 앉은 경우에는 이전에서 변동이 없기 때문에 dp[i-1]을 하면된다. i가 옆으로 이동한 경우에는 왼쪽과 오른쪽 이동이 있는데, dp 테이블을 오른쪽으로 채워가기 때문에 오른쪽으로 이동하는 것은 지금 세지말자. 그러면 i는 i-1자리로 이동할 수 있다. 그럼 i-1에 있는 애는 어디로 갈까? 반드시 i와 스왑을 해야한다. 왜 why? 한쪽으로 계속 미는 방식으로 앉으면 마지막 사람은 앉을 곳이 없기 때문에 이 문제는 무조건 스왑이다. 그렇기 때문에 오른쪽 이동은 dp[i+1]에서 왼쪽으로 스왑할때 책임져 줄 것이다. 아무튼 i, i-1 자리가 바뀌었기 때문에 dp[i-2] 상황에서 새로운 경우가 발생한 것이다. 따라서 dp[i] = dp[i-1] + dp[i-2]이다. 이때 주의할 점은 vip인데, vip는 이동할 수 없고 무조건 본인 자리에 앉아야 하기 때문에 dp[i] = dp[i-1]이 된다. 또한 우리는 왼쪽으로의 이동만 보기로 했기 때문에 vip의 오른쪽에 있는 사람도 왼쪽으로 이동을 할 수 없다. 따라서 그 사람도 dp[i] = dp[i-1]이다. """