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 Perl (v5.18.2) (judge verdict: Wrong Answer)

use strict;

my ($n, $m) = split(/ /, <>);
my @a = ();

while(<>) {
    push @a, int($_);
}

# validate
my $last = $a[0];
foreach my $x (@a[1..$#a]) {
    if ($x - $last <= 1) {
        print "0";
        exit 0;
    }
    $last = $x;
}

# 分割する
push @a, $n+1;
my $cnt = 0;
my $st = 0;
foreach my $en (@a) {
    # $st から $en-1までのステップ数を計算する
    my $tmp = steps($en - 1 - $st);
    # print STDERR "$st --> $en-1 == $tmp\n";

    $cnt = $cnt + $tmp;
    $st = $en + 1;
}
print ($cnt % 1_000_000_007);
exit 0;

sub steps {
    my $seq_len = shift;
    # スキップ無し = 1
    my $cnt = 1;
    # print STDERR "1 = " . $cnt . "\n";
    # 1回スキップ = $n - 1
    my $cnt = $cnt + $seq_len - 1;
    # print STDERR "2 = " . $cnt . "\n";
    # 2回以上スキップ
    my $z = $seq_len - 3;
    my $p = 2;
    while($z > 0) {
        $cnt = $cnt + sum_p_q($p, $z);
        # print STDERR "p/z = $p/$z = " . $cnt . "\n";
        $z = $z - 2;
        $p = $p + 1;
    }
    return $cnt;
}

# sum_1(5) = 5 - 1
# sum_2(5) = 1 + 2 + 3 + 4 + 5
# sum_3(5) = sum_2(5) + sum_2(4) + sum_2(3) + sum_2(2) + sum_2(1)
sub sum_p_q() {
    my $p = shift;
    my $q = shift;
    my $cnt = 0;
    # print STDERR "  p = " . $p . "  q = " . $q . "\n";
    if($p==2) {
        for(my $j=1; $j<=$q; $j++) {
            $cnt = $cnt + $j;
        }
    }else {
        for(my $j=1; $j<=$q; $j++) {
            $cnt = $cnt + sum_p_q($p-1, $j);
        }
    }
    return $cnt;
}