/*
ID: Aman Raj
LANG: C++
TASK: prefix
*/
//#include<iostream>
#include <stdio.h>
//#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#include<math.h>
typedef  long long int ll;
#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <utility>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <iomanip>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//setbase - cout << setbase (16); cout << 100 << endl; Prints 64
//setfill -   cout << setfill ('x') << setw (5); cout << 77 << endl; prints xxx77
//setprecision - cout << setprecision (14) << f << endl; Prints x.xxxx
//cout.precision(x)  cout<<fixed<<val;  // prints x digits after decimal in val

using namespace std;
using namespace __gnu_pbds;

#define f(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) f(i,0,n)
#define fd(i,a,b) for(i=a;i>=b;i--)
#define pb push_back
#define mp make_pair
#define vi vector< int >
#define vl vector< ll >
#define ss second
#define ff first
//#define ll long long
#define pii pair< int,int >
#define pll pair< ll,ll >
#define sz(a) a.size()
#define inf (1000*1000*1000+5)
#define all(a) a.begin(),a.end()
#define tri pair<int,pii>
#define vii vector<pii>
#define vll vector<pll>
#define viii vector<tri>
#define mod (1000*1000*1000+7)
//#define mod 13
#define pqueue priority_queue< int >
#define pdqueue priority_queue< int,vi ,greater< int > >
//#define flush fflush(stdout)
#define primeDEN 727999983
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#include <fstream>
// find_by_order()  // order_of_key
typedef tree<
	int,
	null_type,
	less<int>,
	rb_tree_tag,
	tree_order_statistics_node_update>
	ordered_set;
   ll power(ll a,ll b)//a raised to power b
   {  if(b==0)return 1;if(b==1)return a;
       ll c=power(a,b/2);
       c*=c;c%=mod;if(b%2==1)c*=a;c%=mod;
        return c;
   }
   ll mi(ll a)
   {
       return power(a,mod-2);
   }
   vector<vector<ll> > vtree;
   vector<ll> vcolor;
   vector<ll> visited;
    vector<ll> dp;
    ll ans=0;;
   ll aman(ll a)
   {  visited[a]=1;

     ll no=0;vector<ll> vcol;
     for(auto x:vtree[a])
     {
         if(!visited[x])no=aman(x);
         vcol.push_back(no);

     }
     if(vcolor[a]==1)
     { ll pr=1;
        for(auto x:vcol){pr*=x;pr%=mod;   }
        ans+=pr;
        return 1;

     }
     ll send=0;
     for(auto x:vcol)send+=x;return send+1;


   }
   int main()
{  /*ll n;cin>>n;
    vtree.resize(n);
    for(ll i=0;i<n-1;i++)
    {   ll a;cin>>a;
        vtree[i+1].push_back(a);
        vtree[a].push_back(i+1);
    }
     vcolor.resize(n);
    for(ll i=0;i<n;i++)cin>>vcolor[i];

    visited.resize(n,0);
    dp.resize(n);
     for(ll i=0;i<n;i++){if(vcolor[i]==1)aman(i);   }
      cout<<ans;*/
      ll n,m;cin>>n>>m;
      vector<ll> dp(n+1,0);dp[0]=1;
      for(ll i=0;i<m;i++){ll a;cin>>a;dp[a]=-1;  }
       if(dp[1]==-1)dp[1]=0;else dp[1]=1;
       for(ll i=2;i<=n;i++)
       {
           if(dp[i]!=-1)dp[i]=dp[i-1]+dp[i-2];
           else dp[i]=0;
           dp[i]%=mod;
       }
       cout<<dp[n];
    return 0;
 }


Measured memory_bytes: 1024