// author : Nguyễn Trọng Nguyễn - ITK22 NBK
#include <bits/stdc++.h>
#define int long long
#define ii pair <int, int>
#define fi first
#define sc second
using namespace std;
const int maxn = 200;
const int MOD = 1e9 + 7;
int n, k;
string st;
int ans = 1;
char s[6] = {'(', ')', '[', ']', '{', '}'};
map <vector <char>, int> dp[maxn + 5];
inline int add(int a, int b) {
a += b;
if (a >= MOD) a -= MOD;
return a;
}
int cal (vector <char> stack, int id = 0, int len = 0) {
if (len > k) return 0;
if (id == n) {
return (len == 0);
}
if (dp[id].find(stack) != dp[id].end()) return dp[id][stack];
int cnt = 0;
for (int i = 0; i < 6; i++) {
vector <char> newstack = stack;
int newlen = len;
if (i & 1) { // đóng ngoặc
if (!newlen or newstack.back() != s[i - 1]) continue;
newstack.pop_back();
newlen--;
cnt = add(cnt, cal(newstack, id + 1, newlen));
}
else { // mở ngoặc
newstack.push_back(s[i]);
newlen++;
cnt = add(cnt, cal(newstack, id + 1, newlen));
}
}
return dp[id][stack] = cnt;
}
void get (vector <char> stack, int id = 0, int len = 0) {
if (id == n) return ;
for (int i = 0; i < 6; i++) {
vector <char> newstack = stack;
int newlen = len;
if (i & 1) { // đóng ngoặc
if (!newlen or newstack.back() != s[i - 1]) continue;
newstack.pop_back();
newlen--;
if (s[i] != st[id]) ans = add(ans, cal(newstack, id + 1, newlen));
else {
get(newstack, id + 1, newlen);
break;
}
}
else { // mở ngoặc
newstack.push_back(s[i]);
newlen++;
if (s[i] != st[id]) ans = add(ans, cal(newstack, id + 1, newlen));
else {
get(newstack, id + 1, newlen);
break;
}
}
}
}
signed main (void) {
cin.tie(0)->sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("test.inp","r",stdin);
freopen("test.out","w",stdout);
#endif
int tc; cin >> tc; // không thấy dùng tc, giữ lại cho đủ input
cin >> n >> k >> st;
vector <char> stack;
cal(stack);
stack.clear();
get(stack);
cout << ans % MOD;
return 0;
}
Ly8gYXV0aG9yIDogTmd1eeG7hW4gVHLhu41uZyBOZ3V54buFbiAtIElUSzIyIE5CSwojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KCiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGlpIHBhaXIgPGludCwgaW50PgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Mgc2Vjb25kCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IG1heG4gPSAyMDA7CmNvbnN0IGludCBNT0QgPSAxZTkgKyA3OwoKaW50IG4sIGs7CnN0cmluZyBzdDsKaW50IGFucyA9IDE7CmNoYXIgc1s2XSA9IHsnKCcsICcpJywgJ1snLCAnXScsICd7JywgJ30nfTsKbWFwIDx2ZWN0b3IgPGNoYXI+LCBpbnQ+IGRwW21heG4gKyA1XTsKCmlubGluZSBpbnQgYWRkKGludCBhLCBpbnQgYikgewogICAgYSArPSBiOwogICAgaWYgKGEgPj0gTU9EKSBhIC09IE1PRDsKICAgIHJldHVybiBhOwp9CgppbnQgY2FsICh2ZWN0b3IgPGNoYXI+IHN0YWNrLCBpbnQgaWQgPSAwLCBpbnQgbGVuID0gMCkgewogICAgaWYgKGxlbiA+IGspIHJldHVybiAwOwogICAgaWYgKGlkID09IG4pIHsKICAgICAgICByZXR1cm4gKGxlbiA9PSAwKTsKICAgIH0KCiAgICBpZiAoZHBbaWRdLmZpbmQoc3RhY2spICE9IGRwW2lkXS5lbmQoKSkgcmV0dXJuIGRwW2lkXVtzdGFja107CgogICAgaW50IGNudCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewogICAgICAgIHZlY3RvciA8Y2hhcj4gbmV3c3RhY2sgPSBzdGFjazsKICAgICAgICBpbnQgbmV3bGVuID0gbGVuOwoKICAgICAgICBpZiAoaSAmIDEpIHsgLy8gxJHDs25nIG5nb+G6t2MKICAgICAgICAgICAgaWYgKCFuZXdsZW4gb3IgbmV3c3RhY2suYmFjaygpICE9IHNbaSAtIDFdKSBjb250aW51ZTsKICAgICAgICAgICAgbmV3c3RhY2sucG9wX2JhY2soKTsKICAgICAgICAgICAgbmV3bGVuLS07CiAgICAgICAgICAgIGNudCA9IGFkZChjbnQsIGNhbChuZXdzdGFjaywgaWQgKyAxLCBuZXdsZW4pKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7IC8vIG3hu58gbmdv4bq3YwogICAgICAgICAgICBuZXdzdGFjay5wdXNoX2JhY2soc1tpXSk7CiAgICAgICAgICAgIG5ld2xlbisrOwogICAgICAgICAgICBjbnQgPSBhZGQoY250LCBjYWwobmV3c3RhY2ssIGlkICsgMSwgbmV3bGVuKSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBkcFtpZF1bc3RhY2tdID0gY250Owp9Cgp2b2lkIGdldCAodmVjdG9yIDxjaGFyPiBzdGFjaywgaW50IGlkID0gMCwgaW50IGxlbiA9IDApIHsKICAgIGlmIChpZCA9PSBuKSByZXR1cm4gOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAgICAgICAgdmVjdG9yIDxjaGFyPiBuZXdzdGFjayA9IHN0YWNrOwogICAgICAgIGludCBuZXdsZW4gPSBsZW47CgogICAgICAgIGlmIChpICYgMSkgeyAvLyDEkcOzbmcgbmdv4bq3YwogICAgICAgICAgICBpZiAoIW5ld2xlbiBvciBuZXdzdGFjay5iYWNrKCkgIT0gc1tpIC0gMV0pIGNvbnRpbnVlOwogICAgICAgICAgICBuZXdzdGFjay5wb3BfYmFjaygpOwogICAgICAgICAgICBuZXdsZW4tLTsKICAgICAgICAgICAgaWYgKHNbaV0gIT0gc3RbaWRdKSBhbnMgPSBhZGQoYW5zLCBjYWwobmV3c3RhY2ssIGlkICsgMSwgbmV3bGVuKSk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZ2V0KG5ld3N0YWNrLCBpZCArIDEsIG5ld2xlbik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsgLy8gbeG7nyBuZ2/hurdjCiAgICAgICAgICAgIG5ld3N0YWNrLnB1c2hfYmFjayhzW2ldKTsKICAgICAgICAgICAgbmV3bGVuKys7CiAgICAgICAgICAgIGlmIChzW2ldICE9IHN0W2lkXSkgYW5zID0gYWRkKGFucywgY2FsKG5ld3N0YWNrLCBpZCArIDEsIG5ld2xlbikpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGdldChuZXdzdGFjaywgaWQgKyAxLCBuZXdsZW4pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnNpZ25lZCBtYWluICh2b2lkKSB7CiAgICBjaW4udGllKDApLT5zeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwoKICAgICNpZm5kZWYgT05MSU5FX0pVREdFCiAgICBmcmVvcGVuKCJ0ZXN0LmlucCIsInIiLHN0ZGluKTsKICAgIGZyZW9wZW4oInRlc3Qub3V0IiwidyIsc3Rkb3V0KTsKICAgICNlbmRpZgoKICAgIGludCB0YzsgY2luID4+IHRjOyAvLyBraMO0bmcgdGjhuqV5IGTDuW5nIHRjLCBnaeG7ryBs4bqhaSBjaG8gxJHhu6cgaW5wdXQKICAgIGNpbiA+PiBuID4+IGsgPj4gc3Q7CgogICAgdmVjdG9yIDxjaGFyPiBzdGFjazsKICAgIGNhbChzdGFjayk7CiAgICBzdGFjay5jbGVhcigpOwogICAgZ2V0KHN0YWNrKTsKICAgIGNvdXQgPDwgYW5zICUgTU9EOwoKICAgIHJldHVybiAwOwp9Cg==