using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Program {
    static void Main(string[] args) {
        //入力
        string s = Console.ReadLine();
        int N = int.Parse(s.Split(' ')[0]);
        int M = int.Parse(s.Split(' ')[1]);

        int[] a = new int[N];

        //変数の割り当て
        for (int i = 0; i < M; i++) {
            a[i] = int.Parse(Console.ReadLine());
        }

        //踏んではいけない階段の間を取る
        int[] diff = new int[M + 1];
        for (int i = 0; i < M + 1; i++) {
            if (i == 0) {
                diff[i] = a[0] + 1;
            } else if (i == M) {
                diff[i] = N - a[i - 1] + 1;
            } else {
                diff[i] = a[i] - a[i - 1];
            }
            Console.WriteLine(diff[i]);
        }

        //階段の間の段数に応じたインデックスを求める
        int[] index = new int[diff.Max() + 15];
        for (int i = 0; i < diff.Max() + 15; i++) {
            if (i == 0) {
                index[i] = 0;
            } else if (i == 1) {
                index[i] = 1;
            } else {
                index[i] = index[i - 1] + index[i - 2];
            }

        }

        //回答となる数値
        int ans = 1;

        //それぞれの区域について、掛け算を行っていく
        for (int i = 0; i < M + 1; i++){
            ans *= index[diff[i] - 1];
            if (ans > 1000000007) {
                ans %= 1000000007;
            }
        }

        //出力
        if (ans > 1000000007) {
            Console.WriteLine(ans %= 1000000007);
        } else {
            Console.WriteLine(ans);
        }
        
    }
}