#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
template <class T>
inline void gmax(T &a, T b) {
  if (b > a) a = b;
}
template <class T>
inline void gmin(T &a, T b) {
  if (b < a) a = b;
}
using namespace std;
const int N = 2000 + 10, M = 1e5 + 10, Z = 1e9 + 7, maxint = 2147483647,
          ms1 = 16843009, ms31 = 522133279, ms63 = 1061109567,
          ms127 = 2139062143;
const double PI = acos(-1.0), eps = 1e-8;
void fre() {
  freopen("/Users/luras/Desktop/in.txt", "r", stdin);
  freopen("/Users/luras/Desktop/out.txt", "w", stdout);
}
const int INF = 1e9;
int casenum, casei;
long long f[N][N];
int n, m;
char s[M];
int main() {
  f[1][1] = 1;
  f[0][0] = 1;
  for (int i = 2; i <= 2000; i++) {
    for (int j = 1; j <= i; j++) {
      if (i - j <= j) f[i][j] = (f[i][j] + f[i - 1][j]) % Z;
      f[i][j] = (f[i][j] + f[i - 1][j - 1]) % Z;
    }
  }
  while (~scanf("%d%d", &n, &m)) {
    scanf("%s", s + 1);
    int num = 0, num_ = 0, x = 0, num1 = 0, num2 = 0;
    for (int i = 1; i <= m; i++) {
      if (s[i] == '(')
        x--, num1++;
      else
        x++, num2++;
      gmax(num, x);
    }
    x = 0;
    for (int i = m; i >= 1; i--) {
      if (s[i] == '(')
        x++;
      else
        x--;
      gmax(num_, x);
    }
    long long ans = 0;
    for (int i = 0; i <= n - m; i++) {
      for (int j = 0; j <= i; j++) {
        if (j + j - i >= num && j + num1 <= n / 2 && i - j + num2 <= n / 2) {
          int rst1 = n / 2 - j - num1;
          int rst2 = n / 2 - i + j - num2;
          if (n % 2 == 0 && rst2 - rst1 >= num_)
            ans = (ans + f[i][j] * f[rst1 + rst2][rst2]) % Z;
        }
      }
    }
    printf("%lld\n", ans);
  }
  return 0;
}
