#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define PB push_back
#define FI first
#define SE second
#define MP make_pair
#define ALL(DATAST) DATAST.begin(), DATAST.end()
#define MOD 1000000007ll
#define SIZE 100100ll
ll power(ll a, ll b)
{
ll res = 1;
a = (a % MOD);
while (b)
{
if (b & 1)
res = (res * a) % MOD;
b >>= 1;
a = (a * a) % MOD;
}
return res;
}
ll inverse(ll a)
{
return power(a, MOD - 2);
}
ll fact[SIZE];
ll invfact[SIZE];
void precomp()
{
fact[0] = 1;
invfact[0] = 1;
for (ll i = 1; i < SIZE; i++)
{
fact[i] = (fact[i - 1] * i) % MOD;
invfact[i] = (inverse(i) * invfact[i - 1]) % MOD;
}
}
ll ncr(ll n, ll r)
{
ll val = fact[n];
val = (val * invfact[n - r]) % MOD;
val = (val * invfact[r]) % MOD;
return val;
}
ll catalan(ll n)
{
ll val = ncr(2 * n, n);
val = (val * inverse(n + 1)) % MOD;
return val;
}
map<pair<ll, ll>, ll>um;
ll recur(ll a, ll b)
{
if (a == 0 && b == 0)
return 1;
if (a == 0)
return 0;
if (b == 0)
{
if (a % 2)
return 0;
else
return catalan(a / 2);
}
b = abs(b);
if (a < b)
return 0;
pair<ll, ll>P = MP(a, b);
if (um.find(P) != um.end())
return um[P];
um[P] = recur(a - 1, b + 1) + recur(a - 1, b - 1);
return um[P];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
precomp();
ll m, n;
cin >> n >> m;
string x;
cin >> x;
ll req = 0;
ll balance = 0;
for (ll i = 0; i < m; i++)
{
if (x[i] == '(')
balance++;
else
balance--;
req = min(balance, req);
}
// i need minimum req brackets
// so that a+s+b the closing brackets of
// s are balanced
req = -req;
// cout<<"jfc "<<req<<" "<<balance<<" edc"<<endl;
ll ans = 0;
for (ll i = 0; i <= n - m; i++)
{
cout<<i<<": "<<endl;
for (ll j = req; j <= i; j++)
{
ll aa = recur(i, j);
cout<<i<<" of balance "<<j<<": "<<aa;
ll bb = recur(n - m - i, j + balance);
cout<<" :: & "<<n-m-i<<" of balance "<<j+balance<<": "<<bb<<endl;
ll curr = 0;
curr = (aa * bb) % MOD;
ans = (ans + curr) % MOD;
}
cout<<endl;
}
cout << ans << endl;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBQQiBwdXNoX2JhY2sKI2RlZmluZSBGSSBmaXJzdAojZGVmaW5lIFNFIHNlY29uZAojZGVmaW5lIE1QIG1ha2VfcGFpcgojZGVmaW5lIEFMTChEQVRBU1QpIERBVEFTVC5iZWdpbigpLCBEQVRBU1QuZW5kKCkKI2RlZmluZSBNT0QgMTAwMDAwMDAwN2xsCiNkZWZpbmUgU0laRSAxMDAxMDBsbAoKbGwgcG93ZXIobGwgYSwgbGwgYikKewogICAgbGwgcmVzID0gMTsKICAgIGEgPSAoYSAlIE1PRCk7CiAgICB3aGlsZSAoYikKICAgIHsKICAgICAgICBpZiAoYiAmIDEpCiAgICAgICAgICAgIHJlcyA9IChyZXMgKiBhKSAlIE1PRDsKICAgICAgICBiID4+PSAxOwogICAgICAgIGEgPSAoYSAqIGEpICUgTU9EOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKbGwgaW52ZXJzZShsbCBhKQp7CiAgICByZXR1cm4gcG93ZXIoYSwgTU9EIC0gMik7Cn0KCmxsIGZhY3RbU0laRV07CmxsIGludmZhY3RbU0laRV07Cgp2b2lkIHByZWNvbXAoKQp7CiAgICBmYWN0WzBdID0gMTsKICAgIGludmZhY3RbMF0gPSAxOwogICAgZm9yIChsbCBpID0gMTsgaSA8IFNJWkU7IGkrKykKICAgIHsKICAgICAgICBmYWN0W2ldID0gKGZhY3RbaSAtIDFdICogaSkgJSBNT0Q7CiAgICAgICAgaW52ZmFjdFtpXSA9IChpbnZlcnNlKGkpICogaW52ZmFjdFtpIC0gMV0pICUgTU9EOwogICAgfQp9CgpsbCBuY3IobGwgbiwgbGwgcikKewogICAgbGwgdmFsID0gZmFjdFtuXTsKICAgIHZhbCA9ICh2YWwgKiBpbnZmYWN0W24gLSByXSkgJSBNT0Q7CiAgICB2YWwgPSAodmFsICogaW52ZmFjdFtyXSkgJSBNT0Q7CiAgICByZXR1cm4gdmFsOwp9CgpsbCBjYXRhbGFuKGxsIG4pCnsKICAgIGxsIHZhbCA9IG5jcigyICogbiwgbik7CiAgICB2YWwgPSAodmFsICogaW52ZXJzZShuICsgMSkpICUgTU9EOwogICAgcmV0dXJuIHZhbDsKfQoKbWFwPHBhaXI8bGwsIGxsPiwgbGw+dW07CgpsbCByZWN1cihsbCBhLCBsbCBiKQp7CiAgICBpZiAoYSA9PSAwICYmIGIgPT0gMCkKICAgICAgICByZXR1cm4gMTsKICAgIGlmIChhID09IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZiAoYiA9PSAwKQogICAgewogICAgICAgIGlmIChhICUgMikKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gY2F0YWxhbihhIC8gMik7CiAgICB9CiAgICBiID0gYWJzKGIpOwogICAgaWYgKGEgPCBiKQogICAgICAgIHJldHVybiAwOwogICAgcGFpcjxsbCwgbGw+UCA9IE1QKGEsIGIpOwogICAgaWYgKHVtLmZpbmQoUCkgIT0gdW0uZW5kKCkpCiAgICAgICAgcmV0dXJuIHVtW1BdOwogICAgdW1bUF0gPSByZWN1cihhIC0gMSwgYiArIDEpICsgcmVjdXIoYSAtIDEsIGIgLSAxKTsKICAgIHJldHVybiB1bVtQXTsKfQoKaW50IG1haW4oKQp7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7IGNvdXQudGllKDApOwojaWZuZGVmIE9OTElORV9KVURHRQogICAgZnJlb3BlbigiaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CiAgICBmcmVvcGVuKCJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwojZW5kaWYKCgoKICAgIHByZWNvbXAoKTsKCgogICAgbGwgbSwgbjsKCiAgICBjaW4gPj4gbiA+PiBtOwoKICAgIHN0cmluZyB4OwoKICAgIGNpbiA+PiB4OwoKICAgIGxsIHJlcSA9IDA7CgogICAgbGwgYmFsYW5jZSA9IDA7CgogICAgZm9yIChsbCBpID0gMDsgaSA8IG07IGkrKykKICAgIHsKICAgICAgICBpZiAoeFtpXSA9PSAnKCcpCiAgICAgICAgICAgIGJhbGFuY2UrKzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJhbGFuY2UtLTsKICAgICAgICByZXEgPSBtaW4oYmFsYW5jZSwgcmVxKTsKICAgIH0KICAgIC8vIGkgbmVlZCBtaW5pbXVtIHJlcSBicmFja2V0cwogICAgLy8gc28gdGhhdCBhK3MrYiB0aGUgY2xvc2luZyBicmFja2V0cyBvZgogICAgLy8gcyBhcmUgYmFsYW5jZWQKICAgIHJlcSA9IC1yZXE7CiAgICAvLyBjb3V0PDwiamZjICAiPDxyZXE8PCIgIjw8YmFsYW5jZTw8IiAgZWRjIjw8ZW5kbDsKICAgIGxsIGFucyA9IDA7CiAgICBmb3IgKGxsIGkgPSAwOyBpIDw9IG4gLSBtOyBpKyspCiAgICB7CiAgICAgICAgY291dDw8aTw8IjogIjw8ZW5kbDsKICAgICAgICBmb3IgKGxsIGogPSByZXE7IGogPD0gaTsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgbGwgYWEgPSByZWN1cihpLCBqKTsKICAgICAgICAgICAgY291dDw8aTw8IiBvZiBiYWxhbmNlICI8PGo8PCI6ICI8PGFhOwogICAgICAgICAgICBsbCBiYiA9IHJlY3VyKG4gLSBtIC0gaSwgaiArIGJhbGFuY2UpOwogICAgICAgICAgICBjb3V0PDwiIDo6ICYgIjw8bi1tLWk8PCIgb2YgYmFsYW5jZSAiPDxqK2JhbGFuY2U8PCI6ICI8PGJiPDxlbmRsOwogICAgICAgICAgICBsbCBjdXJyID0gMDsKICAgICAgICAgICAgY3VyciA9IChhYSAqIGJiKSAlIE1PRDsKICAgICAgICAgICAgYW5zID0gKGFucyArIGN1cnIpICUgTU9EOwogICAgICAgIH0KICAgICAgICBjb3V0PDxlbmRsOwogICAgfQoKICAgIGNvdXQgPDwgYW5zIDw8IGVuZGw7CgoKICAgIHJldHVybiAwOwoKCn0=