#include <bits/stdc++.h>
using namespace std;
long long add(long long a, long long b) {
  a += b;
  if (a >= 1000000007) {
    a -= 1000000007;
  }
  return a;
}
long long sub(long long a, long long b) {
  a -= b;
  if (a < 0) {
    a += 1000000007;
  }
  return a;
}
long long mul(long long a, long long b) { return (a * b) % 1000000007; }
void add_self(long long& a, long long b) { a = add(a, b); }
void sub_self(long long& a, long long b) { a = sub(a, b); }
void mul_self(long long& a, long long b) { a = mul(a, b); }
const long long MAXN = 200010;
long long N, K;
long long a[2005];
long long dp[2005][1 << 10];
int main() {
  cin >> N >> K;
  K--;
  for (long long i = 1; i <= N; i++) {
    cin >> a[i];
  }
  dp[0][0] = 1;
  long long U = (1 << K) - 1;
  for (long long i = 1; i <= N; i++) {
    for (long long st = U; st >= 0; st--) {
      if (!dp[i - 1][st]) {
        continue;
      }
      if (a[i] == 2) {
        if (st + 1 <= U) {
          add_self(dp[i][st + 1], dp[i - 1][st]);
        }
      } else if (a[i] == 4) {
        if (st & 1) {
          add_self(dp[i][2], dp[i - 1][st]);
        } else if (st + 2 <= U) {
          add_self(dp[i][st + 2], dp[i - 1][st]);
        }
      } else {
        if (st + 1 <= U) {
          add_self(dp[i][st + 1], dp[i - 1][st]);
        }
        if (st & 1) {
          add_self(dp[i][2], dp[i - 1][st]);
        } else if (st + 2 <= U) {
          add_self(dp[i][st + 2], dp[i - 1][st]);
        }
      }
    }
  }
  long long ans = 1;
  for (long long i = 1; i <= N; i++) {
    if (!a[i]) {
      mul_self(ans, 2);
    }
  }
  for (long long i = 0; i <= U; i++) {
    sub_self(ans, dp[N][i]);
  }
  cout << ans << endl;
  return 0;
}
