#include <bits/stdc++.h>
using namespace std;
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline long long read1() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
const int N = 200010;
const int P = 1e9 + 7;
int dp[110][110][110];
int pw[110];
int Add(int a, int b) {
  a += b;
  return a >= P ? a - P : a;
}
char ch[110];
int main() {
  int n, x;
  n = read();
  x = read();
  scanf("%s", ch + 1);
  for (int i = 1; i <= n; i++) dp[ch[i] - '0'][i][i] = 1;
  pw[0] = pw[1] = 2;
  for (int i = 2; i <= x; i++) {
    pw[i] = (long long)(pw[i - 1]) * pw[i - 2] % P;
    for (int l = 1; l <= n; l++)
      for (int r = l; r <= n; r++) {
        dp[i][l][r] =
            Add((long long)(dp[i - 1][l][r]) * (r == n ? pw[i - 2] : 1) % P,
                (long long)(dp[i - 2][l][r]) * (l == 1 ? pw[i - 1] : 1) % P);
        for (int m = l; m <= r - 1; m++)
          dp[i][l][r] = Add(dp[i][l][r], (long long)(dp[i - 1][l][m]) *
                                             dp[i - 2][m + 1][r] % P);
      }
  }
  cout << dp[x][1][n] << endl;
  return 0;
}
