# abc129_c.py
# https://atcoder.jp/contests/abc129/tasks/abc129_c

# C - Typical Stairs /
# 実行時間制限: 2 sec / メモリ制限: 1024 MB
# 配点 : 300点

# 問題文
# N段の階段があります。高橋君は現在、上り口(0 段目)にいます。 高橋君は一歩で 1 段か 2段上ることができます。
# ただし、a1,a2,a3,....aM段目の床は壊れており、その段に足を踏み入れることは危険です。
# 壊れている床を踏まないようにしながら、最上段(N段目)にたどりつくまでの移動方法は何通りあるでしょうか？ 
# 総数を 1,000,000,007で割った余りを求めてください。

# 制約
#     1≦N≦105
#     0≦M≦N−1
#     1≦a1<a2<
#     ... <aM≦N−1

# 入力
# 入力は以下の形式で標準入力から与えられます。
# N M
# a1
# a2
# .
# .
# .
# aM

# 出力
# 条件を満たすような移動方法の総数を、1,000,000,007で割った余りを出力してください。

# 入力例 1
# 6 1
# 3

# 出力例 1
# 4

# 移動方法は以下の 4通りです。
#     0→1→2→4→5→6
#     0→1→2→4→6
#     0→2→4→5→6
#     0→2→4→6

# 入力例 2
# 10 2
# 4
# 5

# 出力例 2
# 0

# 壊れている床を踏まないような移動方法がない場合もあります。

# 入力例 3
# 100 5
# 1
# 23
# 45
# 67
# 89

# 出力例 3
# 608200469

# 総数を 1,000,000,007で割った余りを出力することに注意して下さい。


global FLAG_LOG
FLAG_LOG = False


def log(value):
    # FLAG_LOG = True
    # FLAG_LOG = False
    if FLAG_LOG:
        print(str(value))


# 妥協しました・・・奇数だとダメです。Nが大きすぎても多分駄目です。
def calculation(lines):
    # S = lines[0]
    # N = int(lines[0])
    N, M = list(map(int, lines[0].split()))
    # values = list(map(int, lines[1].split()))
    # values = list(map(int, lines[2].split()))
    values = list()
    for i in range(M):
        values.append(int(lines[i+1]))
    # valueses = list()
    # for i in range(M):
    #     valueses.append(list(map(int, lines[i+1].split())))

    # 2つ連続して壊れていたらその場で0を返す
    for i in range(len(values)-1):
        if values[i+1] - values[i] == 1:
            return [0]

    # 最低1パターンあるのでこれを積算してゆく
    result = 1

    safe_steps = get_safe_steps(M, N, values)
    log(f'safe_steps=[{safe_steps}]')

    for safe_step in safe_steps:
        result = int((result * def_n_pattern(safe_step)) % 1000000007)

    return [result]


# 壊れた階段をよけた数に分割する
def get_safe_steps(N, M, values):
    # 最小値から順に追加
    ret = list()
    # 到着済みのステップ(=スタート地点)
    prev = 0
    for value in values:
        # 到着済みのステップから次の手前までのステップ数を追加
        ret.append(value - prev - 1)
        # 到着済みのステップを記録
        prev = value + 1
    # 最後の1段を追加
    ret.append(M - prev)
    return ret


# 進む数ごとのパターン数を返す
def def_n_pattern(n):
    if n == 0:
        result = 1
    # if n == 2:
    #     result = 2
    # if n == 10:
    #     result = 89
    # if n == 20:
    #     result = 0
    #     result += 1
    #     result += 19
    #     result += 18*17/2
    #     result += 17*16*15/6
    #     result += 16*15*14*13/24
    #     result += 15*14*13*12*11/120
    #     result += 14*13*12*11*10*9/720
    #     result += 13*12*11*10*9*8*7/5040
    #     result += 12*11*10*9*8*7*6*5/40320
    #     result += 11*10*9*8*7*6*5*4*3/362880
    #     result += 10*9*8*7*6*5*4*3*2*1/3628800

    result = 1
    for i in range(int(n/2)):
        tmp = 1
        for j in range(i):
            tmp *= (n-i-j)
            tmp /= (j+1)
        result += tmp
    return result


# 引数を取得
def get_input_lines():
    line = input()
    N, M = list(map(int, line.split()))
    lines = list()
    lines.append(line)
    for _ in range(M):
        lines.append(input())
    return lines


# テストデータ
def get_testdata(pattern):
    if pattern == 1:
        lines_input = ['6 1', '3']
        lines_export = [4]
    if pattern == 2:
        lines_input = ['10 2', '4', '5']
        lines_export = [0]
    if pattern == 3:
        lines_input = ['100 5', '1', '23', '45', '67', '89']
        lines_export = [608200469]
    return lines_input, lines_export


# 動作モード判別
def get_mode():
    import sys
    args = sys.argv
    global FLAG_LOG
    if len(args) == 1:
        mode = 0
        FLAG_LOG = False
    else:
        mode = int(args[1])
        FLAG_LOG = True
    return mode


# 主処理
def main():
    import time
    started = time.time()
    mode = get_mode()
    if mode == 0:
        lines_input = get_input_lines()
    else:
        lines_input, lines_export = get_testdata(mode)

    lines_result = calculation(lines_input)

    for line_result in lines_result:
        print(line_result)

    # if mode > 0:
    #     print(f'lines_input=[{lines_input}]')
    #     print(f'lines_export=[{lines_export}]')
    #     print(f'lines_result=[{lines_result}]')
    #     if lines_result == lines_export:
    #         print('OK')
    #     else:
    #         print('NG')
    # finished = time.time()
    # duration = finished - started
    # print(f'duration=[{duration}]')


# 起動処理
if __name__ == '__main__':
    main()
