/*
* Problem :: 2302 / 극장 좌석
*
* Kind :: Dynamic Programming
*
* Insight
* - 예제 입력 1
* N=9, VIP=4번,7번
* 1 2 3 4 5 6 7 8 9
* V V
* + 이는 다음과 같이 묶을 수 있다
* (1,2,3) 4 (5,6) 7 (8,9)
* # (1,2,3) - 3가지
* (5,6) - 2가지
* (8,9) - 2가지
* -> 3*2*2 = 총 12가지
*
* - VIP 가 앉지 않는 총 N 좌석이 연속해서 있을 때
* 앉을 수 있는 방법의 가짓수는 몇개일까?
* + N=1 - 1가지
* N=2 - 2가지
* N=3 - 3가지
* N=4 - 5가지
* N=5 - 8가지
* ...
* # dp[i] = VIP 가 앉지 않는 총 i 좌석이 연속해서 있을 때 앉을 수 있는 방법의 가짓수
* dp[i] = dp[i-1] + dp[i-2]
* -> (1,2,3,4,5) 의 경우의 수는
* (1,2,3,4) 5 인 경우의 수와 <= 5번이 자기 좌석에 앉은 경우
* (1,2,3) (5 4) 인 경우의 수를 더한것이다 <= 5번이 옆 좌석에 앉은 경우
*
* Point
* - 피보나치네...?
*
* - 문제의 친절함으로
* Overflow 를 걱정하지 않아도 된다!
* # int 면 충분해~
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Process
int dp[40+1]; /* dp[i] = VIP 가 앉지 않는 총 i 좌석이
* 연속해서 있을 때 앉을 수 있는 방법의 가짓수 */
dp[0] = dp[1] = 1;
dp[2] = 2;
for (int i=3; i<=40; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
// Set up : Input
int N; cin >> N;
int M; cin >> M;
int V[M+2];
/* 편의상 다음과 같이 생각함
* 1 2 3 4 5 6 7 8 9
* V V
* => (1,2,3) 4 (5,6) 7 (8,9)
*
* |
* V
*
* 0 1 2 3 4 5 6 7 8 9 10
* V V V V
* => 0 (1,2,3) 4 (5,6) 7 (8,9) 10
*/
V[0] = 0;
V[M+1] = N+1;
for (int i=1; i<=M; i++) {
cin >> V[i];
}
// Process
int ans = 1;
for (int i=0; i<=M; i++) {
int s = V[i]+1; /* 현재 VIP 오른쪽 좌석 */
int e = V[i+1]-1; /* 다음 VIP 왼쪽 좌석 */
int n = e-s+1; /* VIP 가 앉지 않는 연속한 좌석의 개수 */
ans *= dp[n];
}
// Control : Output
cout << ans << endl;
}
// Helper Functions
/* None */