import java.util.Arrays;
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		int M = sc.nextInt();
		//故障している階段の段数を入れ込む配列宣言
		//初期値にfalseを入れておく。
		//壊れたところにtrue;
		boolean[] dest = new boolean[N];
		Arrays.fill(dest, false);
		for(int i = 0; i<M;i++) {
			int b = sc.nextInt();
			dest[b-1] = true;
		}
		long waru = 1000000007;
		//登れた階段の通りの値を確保する配列宣言
		//[0]は一段目と数える
		long[] anser = new long[N];

		if(N==1) {
			System.out.println(N);
		}else {
			//1,2段目の処理
			anser[0] = !dest[0]? 1:0;
			anser[1] = !dest[1]? anser[0]+1:0;
			//3段目からN段目までの処理
			for(int i = 2; i<N ; i++) {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			}
			System.out.println(anser[N-1]);
		}
	}
} import java.util.Arrays; Arrays java.util import java.util.Scanner; Scanner java.util public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		int M = sc.nextInt();
		//故障している階段の段数を入れ込む配列宣言
		//初期値にfalseを入れておく。
		//壊れたところにtrue;
		boolean[] dest = new boolean[N];
		Arrays.fill(dest, false);
		for(int i = 0; i<M;i++) {
			int b = sc.nextInt();
			dest[b-1] = true;
		}
		long waru = 1000000007;
		//登れた階段の通りの値を確保する配列宣言
		//[0]は一段目と数える
		long[] anser = new long[N];

		if(N==1) {
			System.out.println(N);
		}else {
			//1,2段目の処理
			anser[0] = !dest[0]? 1:0;
			anser[1] = !dest[1]? anser[0]+1:0;
			//3段目からN段目までの処理
			for(int i = 2; i<N ; i++) {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			}
			System.out.println(anser[N-1]);
		}
	}
} Main public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		int M = sc.nextInt();
		//故障している階段の段数を入れ込む配列宣言
		//初期値にfalseを入れておく。
		//壊れたところにtrue;
		boolean[] dest = new boolean[N];
		Arrays.fill(dest, false);
		for(int i = 0; i<M;i++) {
			int b = sc.nextInt();
			dest[b-1] = true;
		}
		long waru = 1000000007;
		//登れた階段の通りの値を確保する配列宣言
		//[0]は一段目と数える
		long[] anser = new long[N];

		if(N==1) {
			System.out.println(N);
		}else {
			//1,2段目の処理
			anser[0] = !dest[0]? 1:0;
			anser[1] = !dest[1]? anser[0]+1:0;
			//3段目からN段目までの処理
			for(int i = 2; i<N ; i++) {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			}
			System.out.println(anser[N-1]);
		}
	} main {

		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		int M = sc.nextInt();
		//故障している階段の段数を入れ込む配列宣言
		//初期値にfalseを入れておく。
		//壊れたところにtrue;
		boolean[] dest = new boolean[N];
		Arrays.fill(dest, false);
		for(int i = 0; i<M;i++) {
			int b = sc.nextInt();
			dest[b-1] = true;
		}
		long waru = 1000000007;
		//登れた階段の通りの値を確保する配列宣言
		//[0]は一段目と数える
		long[] anser = new long[N];

		if(N==1) {
			System.out.println(N);
		}else {
			//1,2段目の処理
			anser[0] = !dest[0]? 1:0;
			anser[1] = !dest[1]? anser[0]+1:0;
			//3段目からN段目までの処理
			for(int i = 2; i<N ; i++) {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			}
			System.out.println(anser[N-1]);
		}
	} Scanner sc = new Scanner(System.in); sc new Scanner(System.in) int N = sc.nextInt(); N sc.nextInt() sc.nextInt sc int M = sc.nextInt(); M sc.nextInt() sc.nextInt sc boolean[] dest = new boolean[N]; dest new boolean[N] N Arrays.fill(dest, false) Arrays.fill Arrays dest false for(int i = 0; i<M;i++) {
			int b = sc.nextInt();
			dest[b-1] = true;
		} int i = 0; int i = 0; i 0 i<M i M i++ i++ i {
			int b = sc.nextInt();
			dest[b-1] = true;
		} {
			int b = sc.nextInt();
			dest[b-1] = true;
		} int b = sc.nextInt(); b sc.nextInt() sc.nextInt sc dest[b-1] = true dest[b-1] dest b-1 b 1 true long waru = 1000000007; waru 1000000007 long[] anser = new long[N]; anser new long[N] N if(N==1) {
			System.out.println(N);
		}else {
			//1,2段目の処理
			anser[0] = !dest[0]? 1:0;
			anser[1] = !dest[1]? anser[0]+1:0;
			//3段目からN段目までの処理
			for(int i = 2; i<N ; i++) {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			}
			System.out.println(anser[N-1]);
		} N==1 N 1 {
			System.out.println(N);
		} System.out.println(N) System.out.println System.out System System.out N {
			//1,2段目の処理
			anser[0] = !dest[0]? 1:0;
			anser[1] = !dest[1]? anser[0]+1:0;
			//3段目からN段目までの処理
			for(int i = 2; i<N ; i++) {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			}
			System.out.println(anser[N-1]);
		} anser[0] = !dest[0]? 1:0 anser[0] anser 0 !dest[0]? 1:0 !dest[0] dest[0] dest 0 1 0 anser[1] = !dest[1]? anser[0]+1:0 anser[1] anser 1 !dest[1]? anser[0]+1:0 !dest[1] dest[1] dest 1 anser[0]+1 anser[0] anser 0 1 0 for(int i = 2; i<N ; i++) {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			} int i = 2; int i = 2; i 2 i<N i N i++ i++ i {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			} {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			} if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				} !dest[i] dest[i] dest i {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				} anser[i] = (anser[i-2] + anser[i-1]) % waru anser[i] anser i (anser[i-2] + anser[i-1]) % waru (anser[i-2] + anser[i-1]) anser[i-2] anser i-2 i 2 anser[i-1] anser i-1 i 1 waru System.out.println(anser[N-1]) System.out.println System.out System System.out anser[N-1] anser N-1 N 1 String[] args args public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		int M = sc.nextInt();
		//故障している階段の段数を入れ込む配列宣言
		//初期値にfalseを入れておく。
		//壊れたところにtrue;
		boolean[] dest = new boolean[N];
		Arrays.fill(dest, false);
		for(int i = 0; i<M;i++) {
			int b = sc.nextInt();
			dest[b-1] = true;
		}
		long waru = 1000000007;
		//登れた階段の通りの値を確保する配列宣言
		//[0]は一段目と数える
		long[] anser = new long[N];

		if(N==1) {
			System.out.println(N);
		}else {
			//1,2段目の処理
			anser[0] = !dest[0]? 1:0;
			anser[1] = !dest[1]? anser[0]+1:0;
			//3段目からN段目までの処理
			for(int i = 2; i<N ; i++) {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			}
			System.out.println(anser[N-1]);
		}
	}
} public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		int M = sc.nextInt();
		//故障している階段の段数を入れ込む配列宣言
		//初期値にfalseを入れておく。
		//壊れたところにtrue;
		boolean[] dest = new boolean[N];
		Arrays.fill(dest, false);
		for(int i = 0; i<M;i++) {
			int b = sc.nextInt();
			dest[b-1] = true;
		}
		long waru = 1000000007;
		//登れた階段の通りの値を確保する配列宣言
		//[0]は一段目と数える
		long[] anser = new long[N];

		if(N==1) {
			System.out.println(N);
		}else {
			//1,2段目の処理
			anser[0] = !dest[0]? 1:0;
			anser[1] = !dest[1]? anser[0]+1:0;
			//3段目からN段目までの処理
			for(int i = 2; i<N ; i++) {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			}
			System.out.println(anser[N-1]);
		}
	}
} Main
import java.util.Arrays;
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		int M = sc.nextInt();
		//故障している階段の段数を入れ込む配列宣言
		//初期値にfalseを入れておく。
		//壊れたところにtrue;
		boolean[] dest = new boolean[N];
		Arrays.fill(dest, false);
		for(int i = 0; i<M;i++) {
			int b = sc.nextInt();
			dest[b-1] = true;
		}
		long waru = 1000000007;
		//登れた階段の通りの値を確保する配列宣言
		//[0]は一段目と数える
		long[] anser = new long[N];

		if(N==1) {
			System.out.println(N);
		}else {
			//1,2段目の処理
			anser[0] = !dest[0]? 1:0;
			anser[1] = !dest[1]? anser[0]+1:0;
			//3段目からN段目までの処理
			for(int i = 2; i<N ; i++) {
				if(!dest[i]) {
					anser[i] = (anser[i-2] + anser[i-1]) % waru;
				}
			}
			System.out.println(anser[N-1]);
		}
	}
}