#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;
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zLHVucm9sbC1sb29wcyIpCiNpbmNsdWRlICJiaXRzL3N0ZGMrKy5oIgp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCnR5cGVkZWYgbG9uZyBsb25nICBsbGkgOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOwp0eXBlZGVmIHZlY3RvcjxsbGkgPiB2aTsKdHlwZWRlZiBwYWlyPGxsaSAsbGxpID4gaWk7CiAKI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSBmb3JlKGksYSxiKSBmb3IobGxpICBpID0gYTsgaSA8ICBiOyBpKyspCiNkZWZpbmUgc3oocykgbGxpIChzLnNpemUoKSkKI2RlZmluZSBhbGwocykgYmVnaW4ocyksIGVuZChzKQojZGVmaW5lIGYgZmlyc3QKI2RlZmluZSBzIHNlY29uZAojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIF8gaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7Y2luLnRpZSgwKTtjb3V0LnRpZSgwKTsKI2RlZmluZSBwZXJyKHgpIGNlcnI8PCN4PDwiICI8PHg8PGVuZGwKdHlwZWRlZiB2ZWN0b3I8dmVjdG9yPGxvbmcgbG9uZz4gPiBNYXRyaXg7CgpNYXRyaXggYigyLCB2aSgyLDEpKTsKTWF0cml4IGEoMSx2aSgyKSk7Cgpsb25nIGxvbmcgTU9EID0gMWU5ICsgNzsKTWF0cml4IG9uZXMoaW50IG4pIHsKTWF0cml4IHIobix2ZWN0b3I8bG9uZyBsb25nPihuKSk7Cglmb3IoaW50IGkgPSAwOyBpIDwgbjsgKytpKSByW2ldW2ldID0gMTsKCXJldHVybiByOwp9Ck1hdHJpeCBvcGVyYXRvciooTWF0cml4ICZhLCBNYXRyaXggJmIpIHsKCWludCBuPShpbnQpKGEuc2l6ZSgpKSxtPShpbnQpKGJbMF0uc2l6ZSgpKSx6PShpbnQpKGFbMF0uc2l6ZSgpKTsKCU1hdHJpeCByKG4sdmVjdG9yPGxvbmcgbG9uZz4obSkpOwoJZm9yKGludCBpID0gMDsgaSA8IG47ICsraSkgZm9yKGludCBqID0gMDsgaiA8IG07ICsraikgZm9yKGludCBrID0gMDsgayA8IHo7ICsraykKCQlyW2ldW2pdKz1hW2ldW2tdKmJba11bal0scltpXVtqXSU9TU9EOwoJcmV0dXJuIHI7Cn0KTWF0cml4IGJlKE1hdHJpeCBiLCBsb25nIGxvbmcgZSkgewoJTWF0cml4IHI9b25lcygoaW50KShiLnNpemUoKSkpOwoJd2hpbGUoZSl7aWYoZSYxTEwpcj1yKmI7Yj1iKmI7ZS89Mjt9CglyZXR1cm4gcjsKfQoKaWkgY29tcHV0ZV9maWIoaW50IHgsIGludCBjdXIsIGludCBwcmV2KXsKCiAgICBhWzBdWzBdID0gY3VyOwogICAgYVswXVsxXSA9IHByZXY7CgogICAgaWYoeCA9PSAwKSByZXR1cm4ge2N1ciwgcHJldn07CgogICAgTWF0cml4IFAgPSBiZShiLCB4KTsKICAgIE1hdHJpeCByZXMgPSBhKlA7CiAgICByZXR1cm4ge3Jlc1swXVswXSwgcmVzWzBdWzFdfTsKfQoKaW50IG1haW4oKSB7XwogICAgYlsxXVsxXSA9IDA7CgogICAgaW50IG4sIG07CiAgICBjaW4gPj4gbiA+PiBtOwoKICAgIHZlY3RvcjxpbnQ+IGEobSk7CiAgICBmb3JlKGksMCxtKSBjaW4gPj4gYVtpXTsKICAgIHNvcnQoYWxsKGEpKTsKCiAgICBib29sIHBvc3MgPSB0cnVlOwogICAgZm9yZShpLDAsbS0xKXsKICAgICAgICBpZihhW2ldICsgMSA9PSBhW2krMV0peyBwb3NzID0gZmFsc2U7YnJlYWs7fQogICAgfQogICAgaWYoIXBvc3Mpe2NvdXQgPDwgMCA8PCBlbmRsO3JldHVybiAwO30KCiAgICB2ZWN0b3I8aW50PiBjID0gezB9OwogICAgZm9yZShpLDAsbSkge2lmKGFbaV0gPCBuICBhbmQgYVtpXSA+IDApYy5wYihhW2ldKTt9CiAgICBjLnBiKG4rMSk7CgogICAgdmVjdG9yPGludD4gYjsKICAgIGZvcmUoaSwxLHN6KGMpKSBiLnBiKGNbaV0gLSBjW2ktMV0gLSAxKTsKCiAgICBpbnQgY3VyID0gMTsgICAKICAgIGludCBwcmV2ID0gMDsKCiAgICBmb3JlKGksMCxzeihiKSl7CiAgICAgICAgYXV0byBueHQgPSBjb21wdXRlX2ZpYihiW2ldLCBjdXIsIHByZXYpOwogICAgICAgIGN1ciA9IG54dC5mOwogICAgICAgIHByZXYgPSBueHQuczsKICAgICAgICBpZihpICsxICE9IHN6KGIpKXsgICAgICAgIAogICAgICAgICAgICBwcmV2ID0gY3VyOyAgICAgICAgICAgIAogICAgICAgICAgICBjdXIgPSAwOyAgICAgICAgICAgICAgIAogICAgICAgIH0KICAgIH0KICAgIGNvdXQgPDwgY3VyIDw8IGVuZGw7Cn0=