#pragma GCC optimize("O3,unroll-loops")
#include "bits/stdc++.h"
using namespace std;
 
typedef long long  lli ;
typedef long double ld;
typedef vector<lli > vi;
typedef pair<lli ,lli > ii;
 
#define endl '\n'
#define fore(i,a,b) for(lli  i = a; i <  b; i++)
#define sz(s) lli (s.size())
#define all(s) begin(s), end(s)
#define f first
#define s second
#define pb push_back
#define _ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define perr(x) cerr<<#x<<" "<<x<<endl
typedef vector<vector<long long> > Matrix;

Matrix b(2, vi(2,1));
Matrix a(1,vi(2));

long long MOD = 1e9 + 7;
Matrix ones(int n) {
Matrix r(n,vector<long long>(n));
	for(int i = 0; i < n; ++i) r[i][i] = 1;
	return r;
}
Matrix operator*(Matrix &a, Matrix &b) {
	int n=(int)(a.size()),m=(int)(b[0].size()),z=(int)(a[0].size());
	Matrix r(n,vector<long long>(m));
	for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j) for(int k = 0; k < z; ++k)
		r[i][j]+=a[i][k]*b[k][j],r[i][j]%=MOD;
	return r;
}
Matrix be(Matrix b, long long e) {
	Matrix r=ones((int)(b.size()));
	while(e){if(e&1LL)r=r*b;b=b*b;e/=2;}
	return r;
}

ii compute_fib(int x, int cur, int prev){

    a[0][0] = cur;
    a[0][1] = prev;

    if(x == 0) return {cur, prev};

    Matrix P = be(b, x);
    Matrix res = a*P;
    return {res[0][0], res[0][1]};
}

int main() {_
    b[1][1] = 0;

    int n, m;
    cin >> n >> m;

    vector<int> a(m);
    fore(i,0,m) cin >> a[i];
    sort(all(a));

    bool poss = true;
    fore(i,0,m-1){
        if(a[i] + 1 == a[i+1]){ poss = false;break;}
    }
    if(!poss){cout << 0 << endl;return 0;}

    vector<int> c = {0};
    fore(i,0,m) {if(a[i] < n  and a[i] > 0)c.pb(a[i]);}
    c.pb(n+1);

    vector<int> b;
    fore(i,1,sz(c)) b.pb(c[i] - c[i-1] - 1);

    int cur = 1;   
    int prev = 0;

    fore(i,0,sz(b)){
        auto nxt = compute_fib(b[i], cur, prev);
        cur = nxt.f;
        prev = nxt.s;
        if(i +1 != sz(b)){        
            prev = cur;            
            cur = 0;               
        }
    }
    cout << cur << endl;
}