program abc129c
  implicit none
  integer  :: n, m, i
  integer, allocatable :: a(:)

  read(*,*) n, m
  allocate(a(m))
  do i = 1, m
    read(*,*) a(i)
  end do

  print *, climb(0,n,a)
  stop

contains

  ! 全探索による方法; 再帰的に試行して、壊れた階段を踏んだら打ち切り、トップに至った回数を出力する
  recursive function climb(k,top,broken) result(res)
    implicit none
    integer, intent(in) :: k, top, broken(:) ! 今いる段数, 一番上
    integer :: res
    ! result変数にはintent属性をつけない

    ! 1段または2段を登り、壊れた段にきたら0、上まで登りきったら1を合計して返す。
    if (k == top) then
      res = 1
      return
    else if (k > top) then
      res = 0
      return
    else if (sum(broken, mask=(broken==k))>0 ) then
      res = 0
      return
    else
      res = climb(k+1,top, broken) + climb(k+2,top,broken)
      return
    endif
  end function climb

end program abc129c
