Problem:
Score : 300 points

Problem Statement

There is a staircase with N steps. Takahashi is now standing at the foot of the stairs, that is, on the 0-th step.
He can climb up one or two steps at a time.

However, the treads of the a_1-th, a_2-th, a_3-th, \ldots, a_M-th steps are broken, so it is dangerous to set foot on those steps.

How many are there to climb up to the top step, that is, the N-th step, without setting foot on the broken steps?
Find the count modulo 1\ 000\ 000\ 007.

Constraints

1 \leq N \leq 10^5

0 \leq M \leq N-1

1 \leq a_1 < a_2 < ... < a_M \leq N-1

Input

Input is given from Standard Input in the following format:

N M
a_1
a_2
.
.
.
a_M

Output

Print the number of ways to climb up the stairs under the condition, modulo 1\ 000\ 000\ 007.

Sample Input 1

6 1
3

Sample Output 1

4

There are four ways to climb up the stairs, as follows:

0 \to 1 \to 2 \to 4 \to 5 \to 6

0 \to 1 \to 2 \to 4 \to 6

0 \to 2 \to 4 \to 5 \to 6

0 \to 2 \to 4 \to 6

Sample Input 2

10 2
4
5

Sample Output 2

0

There may be no way to climb up the stairs without setting foot on the broken steps.

Sample Input 3

100 5
1
23
45
67
89

Sample Output 3

608200469

Be sure to print the count modulo 1\ 000\ 000\ 007.

Solution in C (GCC 5.4.1) (judge verdict: Accepted)

// https://atcoder.jp/contests/abc129/tasks/abc129_c

#include <stdio.h>
#define FOR(i,L,R) for (int i = L; i < R; i++)
#define MOD 1000000007
#define wez(n) int (n); scanf("%d",&(n))

int main(){
    wez(n);
    wez(m);
    int arr[100000];
    // initiate every step to value -1
    for (int i = 0; i <= n; i++)
        arr[i] = -1;
    
    // if the step is broke, change every value to 0
    FOR(i, 0, m){
        wez(a);
        arr[a] = 0;
    }
    
    // set the foot of the stairs equal to 1, and if the first step isn't broken, set it equal to 1
    arr[0] = 1;
    if (arr[1] == -1)
        arr[1] = 1;
    
    /* basically, we go to every step that isn't broken. to find the amount of different ways to get to that step,
       you just add the number of different ways to get to the last two steps. */
    for (int i = 0; i <= n; i++){
        if (arr[i] == -1)
            arr[i] = (arr[i - 1] + arr[i - 2]) % MOD;
    }
    
    printf("%d\n", arr[n]);
}