int n, m; int a[kMaxN], sum[kMaxN], f[kMaxN][kMaxN], fac[kMaxN], ifac[kMaxN]; std::string str;
constexprintqpow(int bs, int64_t idx = kMod - 2){ int ret = 1; for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod) if (idx & 1) ret = (int64_t)ret * bs % kMod; return ret; }
inlineintadd(int x, int y){ return (x + y >= kMod ? x + y - kMod : x + y); } inlineintsub(int x, int y){ return (x >= y ? x - y : x - y + kMod); } inlinevoidinc(int &x, int y){ (x += y) >= kMod ? x -= kMod : x; } inlinevoiddec(int &x, int y){ (x -= y) < 0 ? x += kMod : x; }
voidprework(int n = 300){ fac[0] = ifac[0] = 1; for (int i = 1; i <= n; ++i) { fac[i] = 1ll * i * fac[i - 1] % kMod; ifac[i] = qpow(fac[i]); } }
voiddickdreamer(){ std::cin >> n >> str; int lst = 0; for (int i = 1; i <= n; ++i) { if (str[i - 1] == 'B') { a[++m] = i - lst - 1; lst = i; } } prework(); std::reverse(a + 1, a + 1 + m); for (int i = 1; i <= m; ++i) sum[i] = sum[i - 1] + a[i]; int cnt = n - m; for (int i = a[1]; i <= cnt; ++i) f[1][i] = fac[m - 1]; for (int i = cnt; ~i; --i) { for (int j = m; j; --j) { for (int k = cnt; k >= sum[j]; --k) { for (int c = 1; c <= std::min(j, (i ? k / i : n)); ++c) { if (k - i * (c - 1) >= sum[j - c + 1]) inc(f[j][k], 1ll * f[j - c][k - i * c] * ifac[c] % kMod); elsebreak; } } } } std::cout << f[m][cnt] << '\n'; }