n,m = list(map(int, input().split()))

a = [-1] + [int(eval(input())) for _ in range(m)] + [n + 1]

MOD = 10 ** 9 + 7



fib = [0, 1]

for i in range(100100):

	fib.append((fib[i] + fib[i + 1] % MOD))



res = 1

for i in range(m + 1):

	p, q = a[i], a[i + 1]

	res = (res * fib[q - p - 1]) % MOD



print(res)
n,m = list(map(int, input().split()))

a = [int(eval(input())) for _ in range(m)]

MOD = 10 ** 9 + 7



# broken[i] : i段目が壊れていたらTrue

broken = [False] * 100100

for i in a:

	broken[i] = True



# dp[i] : i段目に行く通り数

dp = [0] * 100100



# 0段目に行く方法は1通り

dp[0] = 1



# 1段目からn段目について調べる

for i in range(1, n + 1):

	# 壊れてるなら

	if broken[i]:

		# その段には進めないので0通り

		dp[i] = 0

	# 壊れてないなら

	else:

		# i - 1段目から移動可能 (i - 1段目は, i == 0 のときにはないので分岐)

		if i > 0:

			dp[i] += dp[i - 1]

		# i - 2段目から移動可能 (i - 2段目は, i == 0, 1 のときにはないので分岐)

		if i > 1:

			dp[i] += dp[i - 2]

	dp[i] %= MOD



print((dp[n]))
n, m = list(map(int, input().split()))
a = [-1] + [int(eval(input())) for _ in range(m)] + [n + 1]
MOD = 10**9 + 7
fib = [0, 1]
for i in range(100100):
    fib.append((fib[i] + fib[i + 1] % MOD))
res = 1
for i in range(m + 1):
    p, q = a[i], a[i + 1]
    res = (res * fib[q - p - 1]) % MOD
print(res)

n, m = list(map(int, input().split()))
a = [int(eval(input())) for _ in range(m)]
MOD = 10**9 + 7
# broken[i] : i段目が壊れていたらTrue
broken = [False] * 100100
for i in a:
    broken[i] = True
# dp[i] : i段目に行く通り数
dp = [0] * 100100
# 0段目に行く方法は1通り
dp[0] = 1
# 1段目からn段目について調べる
for i in range(1, n + 1):
    # 壊れてるなら
    if broken[i]:
        # その段には進めないので0通り
        dp[i] = 0
    # 壊れてないなら
    else:
        # i - 1段目から移動可能 (i - 1段目は, i == 0 のときにはないので分岐)
        if i > 0:
            dp[i] += dp[i - 1]
        # i - 2段目から移動可能 (i - 2段目は, i == 0, 1 のときにはないので分岐)
        if i > 1:
            dp[i] += dp[i - 2]
    dp[i] %= MOD
print((dp[n]))

-a = [-1] + [int(eval(input())) for _ in range(m)] + [n + 1] +a = [int(eval(input())) for _ in range(m)] -fib = [0, 1] -for i in range(100100): -    fib.append((fib[i] + fib[i + 1] % MOD)) -res = 1 -for i in range(m + 1): -    p, q = a[i], a[i + 1] -    res = (res * fib[q - p - 1]) % MOD -print(res) +# broken[i] : i段目が壊れていたらTrue +broken = [False] * 100100 +for i in a: +    broken[i] = True +# dp[i] : i段目に行く通り数 +dp = [0] * 100100 +# 0段目に行く方法は1通り +dp[0] = 1 +# 1段目からn段目について調べる +for i in range(1, n + 1): +    # 壊れてるなら +    if broken[i]: +        # その段には進めないので0通り +        dp[i] = 0 +    # 壊れてないなら +    else: +        # i - 1段目から移動可能 (i - 1段目は, i == 0 のときにはないので分岐) +        if i > 0: +            dp[i] += dp[i - 1] +        # i - 2段目から移動可能 (i - 2段目は, i == 0, 1 のときにはないので分岐) +        if i > 1: +            dp[i] += dp[i - 2] +    dp[i] %= MOD +print((dp[n]))