#include <bits/stdc++.h>
using namespace std;
template <class T>
T ceil(T a, T b) {
  return (a + b - 1) / b;
}
template <class T>
T round(T a, T b) {
  return (a + b / 2) / b;
}
template <class T>
T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}
template <class T>
T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
template <class T>
bool amax(T& a, const T& b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
bool amin(T& a, const T& b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
long long modpow(long long a, long long b, long long m) {
  if (b == 0) {
    return 1;
  } else if (b % 2 == 0) {
    long long h = modpow(a, b / 2, m);
    return h * h % m;
  } else {
    return a * modpow(a, b - 1, m) % m;
  }
}
long long comb(long long a, long long b, long long m) {
  if (b > a - b) {
    return comb(a, a - b, m);
  }
  long long c = 1, d = 1;
  for (int i = (int)(0); i < (int)(b); i += (int)(1)) {
    c *= (a - i);
    d *= (b - i);
    c %= m;
    d %= m;
  }
  return c * modpow(d, m - 2, m) % m;
}
const int MOD = 1000000007;
int N, M;
map<int, int> m;
vector<long long> dp;
long long solve(int pos) {
  if (pos == N) {
    return 1;
  } else if (pos > N) {
    return 0;
  }
  if (dp[pos] > 0) {
    return dp[pos];
  }
  long long res = 0;
  for (int i = (int)(1); i < (int)(3); i += (int)(1)) {
    if (m.count(pos + i)) {
      continue;
    }
    res += solve(pos + i);
    res %= MOD;
  }
  return dp[pos] = res;
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> N >> M;
  for (int i = (int)(0); i < (int)(M); i += (int)(1)) {
    int a;
    cin >> a;
    m[a] = 1;
  }
  dp = vector<long long>(N + 1, 0);
  solve(0);
  cout << dp[0] << endl;
  return 0;
}
