#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

const int mod = 1'000'000'007;

void add(int &a, int b) {
  a += b;
  if (a >= mod) {
    a -= mod;
  }
}

int mul(int a, int b) {
  return (int)((long long)a * b % mod);
}

int pw(int a, int b) {
  int res = 1;
  while (b > 0) {
    if (b % 2 == 1) {
      res = mul(res, a);
    }
    a = mul(a, a);
    b /= 2;
  }
  return res;
}

int inv(int a) {
  return pw(a, mod - 2);
}

const int N = 79;

char t[N];
int fact[N];
int rfact[N];
int c[2 * N][2 * N];
int cnt_r[N];
int f[N][N][N];
int nf[N][N][N];

int main() {
  fact[0] = 1;
  rfact[0] = 1;
  for (int i = 1; i < N; ++i) {
    fact[i] = mul(fact[i - 1], i);
    rfact[i] = inv(fact[i]);
  }
  memset(c, 0, sizeof c);
  for (int i = 0; i < 2 * N; ++i) {
    c[i][0] = 1;
    c[i][i] = 1;
    for (int j = 1; j < i; ++j) {
      c[i][j] = c[i - 1][j - 1];
      add(c[i][j], c[i - 1][j]);
    }
  }
  int n, m;
  scanf("%d %d %s", &n, &m, t);
  vector<int> need, size;
  need.push_back(1);
  size.push_back(1);
  need.push_back(1);
  size.push_back(2);
  need.push_back(1);
  size.push_back(2);
  need.push_back(1);
  size.push_back(3);
  need.push_back(2);
  size.push_back(3);
  for (int i = 4; i <= n; ++i) {
    need.push_back(i / 2);
    size.push_back(i);
    
    need.push_back((i + 1) / 2);
    size.push_back(i);
  }
  vector<int> pr;
  for (int i = 0; i < m; ++i) {
    if (t[i] == 'r') {
      pr.push_back(i);
    }
  }
  vector<int> pb;
  if (!pr.empty()) {
    for (int i = pr[0] + 1; i < m; ++i) {
      if (t[i] == 'b') {
        pb.push_back(i);
        break;
      }
    }
    if (pb.empty()) {
      pb.push_back(m);
    }
  }
  for (int i = 1; i < (int)pr.size(); ++i) {
    for (int j = max(pr[i], pb[i - 1]) + 1; j < m; ++j) {
      if (t[j] == 'b') {
        pb.push_back(j);
        break;
      }
    }
    if ((int)pb.size() < i + 1) {
      pb.push_back(m);
    }
  }
  int ans = 1;
  for (int cnt = 1; cnt <= min(35, (int)pr.size()); ++cnt) {
    memset(cnt_r, 0, sizeof cnt_r);
    for (int i = 0; i < cnt; ++i) {
      cnt_r[pr[i]] = 1;
    }
    for (int i = m - 2; i >= 0; --i) {
      cnt_r[i] += cnt_r[i + 1];
    }
    memset(f, 0, sizeof f);
    for (int i = 0; i <= cnt; ++i) {
      f[i][0][i] = rfact[i];
    }
    for (int it = 0; it < (int)need.size(); ++it) {
      for (int i = 0; i <= cnt; ++i) {
        for (int j = 0; j <= m; ++j) {
          for (int s = 0; s <= n; ++s) {
            nf[i][j][s] = f[i][j][s];
          }
        }
      }
      for (int i = 0; i <= cnt; ++i) {
        for (int j = 0; j <= m; ++j) {
          for (int s = 0; s <= n; ++s) {
            if (f[i][j][s] == 0) {
              continue;
            }
            for (int k = 1; k <= n; ++k) {
              int ni = i + k;
              int nj = j + need[it] * k;
              int ns = s + size[it] * k;
              if (ni >= cnt + 1 || nj >= m + 1 || ns >= n + 1) {
                break;
              }
              int pos = pb[cnt - 1 - (ni - 1)];
              if (pos == m) {
                break;
              }
              if ((m - pos) - j - need[it] * (k - 1) - cnt_r[pos] < need[it]) {
                break;
              }
              add(nf[ni][nj][ns], mul(f[i][j][s], rfact[k]));
            }
          }
        }
      }
      for (int i = 0; i <= cnt; ++i) {
        for (int j = 0; j <= m; ++j) {
          for (int s = 0; s <= n; ++s) {
            f[i][j][s] = nf[i][j][s];
          }
        }
      }
    }
    for (int j = 0; j <= m; ++j) {
      for (int s = 0; s <= n; ++s) {
        if (n - s >= cnt - 1) {
          add(ans, mul(f[cnt][j][s], mul(fact[cnt], c[(n - s - (cnt - 1)) + (s + (cnt - 1) + 2) - 1][(s + (cnt - 1) + 2) - 1])));
        }
      }
    }
  }
  printf("%d\n", ans);
}


Measured memory_bytes: 3200