#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
const int INF = 1001001000;
const int MOD = 1000000007;
long long gcd(long long a, long long b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
long long lcm(long long a, long long b) { return a * b / gcd(a, b); }
using Graph = vector<vector<int>>;
long long mod_pow(long long N, long long M) {
  if (M == 0) return 1;
  long long res = mod_pow((N * N) % MOD, M / 2);
  if (M & 1) res = (res * N) % MOD;
  return res %= MOD;
}
long long nCr(long long n, long long r) {
  long long A = 1, B = 1;
  for (long long i = n - r + 1; i <= n; i++) {
    A = A * i % MOD;
  }
  for (long long i = 1; i <= r; i++) {
    B = B * i % MOD;
  }
  B = mod_pow(B, MOD - 2);
  B %= MOD;
  return (A * B) % MOD;
}
bool E[2005][2005];
vector<bool> seen;
int D[2005];
int color[101];
int find_time = 0;
int main() {
  int N, M;
  cin >> N >> M;
  vector<long long> broken(M);
  for (int i = 0; i < M; i++) {
    cin >> broken.at(i);
  }
  long long dp[114514];
  for (int i = 0; i < 114514; i++) dp[i] = 0;
  for (int i = 0; i < M; i++) dp[broken.at(i)] = -1;
  dp[0] = 1;
  for (int i = 0; i < N; i++) {
    if (dp[i + 1] == -1 && dp[i + 2] == -1) {
      cout << 0 << endl;
      return 0;
    }
    for (int j = i + 1; j <= min(N, i + 2); j++) {
      if (dp[j] != -1) {
        dp[j] += dp[i] + 1;
        dp[j] %= MOD;
      }
    }
  }
  cout << dp[N] << endl;
}
