#include <bits/stdc++.h>
using namespace std;
const long long mod = 10e9 + 7;

int main(){
	int N, M;
	cin >> N >> M;
	vector<long long> dp(N + 1, 0);
	vector<bool> pos(N + 1, true);
	for(int i = 0; i < M; i++){
		int n;
		cin >> n;
		pos[n] = false;
	}
	
	dp[0]++;
	if(pos[1]) dp[1]++;
		
	for(int i = 2; i <= N; i++){
		if(pos[i]){
			dp[i] += (dp[i - 1] + dp[i - 2]);
			dp[i] %= mod;
		}
	}
	
	cout << dp[N] << endl;
}

/*i-1段目とi-2段目の移動方法の和がi段目の移動方法
dp[i] = dp[i - 1] + dp[i - 2]
pos[i]で壊れているかどうかを判定
pos[i] = false の場合、i段目の移動方法は0であることと同値なので考えない