#include <cstdio>
using namespace std;
typedef long long ll;
ll mod = 1000000007LL;
char s[505];
ll f[505][505], g[505][505], fsum[505][505];
// fsum[i][j] = f[i][j] + f[i + 1][j] + ... + f[n][j]
bool X[505][505];
bool is_left_bracket[505], is_right_bracket[505];
int R[505];
int min(int a, int b) {
return a < b ? a : b;
}
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int n, k;
scanf("%d %d\n", &n, &k);
for (int i = 1; i <= n; i++) {
s[i] = getchar();
if (s[i] == '?' || s[i] == '(') {
is_left_bracket[i] = true;
}
if (s[i] == '?' || s[i] == ')') {
is_right_bracket[i] = true;
}
}
for (int i = 1; i <= n; i++) {
X[i][i - 1] = true;
}
for (int i = 1; i <= n; i++) {
if (s[i] == '*' || s[i] == '?') {
X[i][i] = true;
}
}
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= min(n, i + k); j++) {
if (s[j] == '*' || s[j] == '?') {
X[i][j] = X[i][j - 1];
}
}
}
for (int i = 1; i <= n; i++) {
while (X[i][i + R[i]] && R[i] < k) {
R[i]++;
}
}
for (int l = 1; l < n; l++) {
if (is_left_bracket[l] && is_right_bracket[l + 1]) {
f[l][l + 1] = 1LL;
fsum[l][l + 1] = 1LL;
}
}
for (int len = 3; len <= n; len++) {
for (int l = 1; l <= n - len + 1; l++) {
int r = l + len - 1;
if (is_left_bracket[l] && is_right_bracket[r]) {
// (S)
if (len - 2 <= k && X[l + 1][r - 1]) {
f[l][r] = (f[l][r] + 1LL) % mod;
}
// (A)
f[l][r] = (f[l][r] + f[l + 1][r - 1] + g[l + 1][r - 1]) % mod;
// (SA)
for (int l2 = l + 1; l2 <= min(r - 2, l + k); l2++) {
if (X[l + 1][l2]) {
f[l][r] = (f[l][r] + f[l2 + 1][r - 1] + g[l2 + 1][r - 1]) % mod;
}
}
// (AS)
for (int r2 = r - 1; r2 >= max(l + 2, r - k); r2--) {
if (X[r2][r - 1]) {
f[l][r] = (f[l][r] + f[l + 1][r2 - 1] + g[l + 1][r2 - 1]) % mod;
}
}
// AB & ASB
for (int i = l + 1; i < r; i++) {
g[l][r] = (g[l][r] + (f[l][i] + g[l][i]) * (fsum[i + 2][r] - fsum[min(i + 1 + R[i + 1], r - 1) + 1][r] + f[i + 1][r] + mod) % mod) % mod;
}
}
fsum[l][r] = (fsum[l + 1][r] + f[l][r]) % mod;
}
}
printf("%lld", (f[1][n] + g[1][n]) % mod);
return 0;
}