#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef long double ld; typedef pair ii; typedef vector vi; typedef vector vvi; typedef vector vii; #define x first #define y second #define pb push_back #define eb emplace_back #define rep(i,a,b) for(auto i=(a); i<(b); ++i) #define REP(i,n) rep(i,0,n) #define all(v) (v).begin(), (v).end() #define rs resize #define DBG(x) cerr << __LINE__ << ": " << #x << " = " << (x) << endl const ld PI = acos(-1.0); template using min_queue = priority_queue, greater>; template int sz(const T &x) { return (int) x.size(); // copy the ampersand(&)! } // START OF ACTUAL PROGRAM, START READING HERE const ll MOD = 1'000'000'007; void run() { ll n; cin >> n; string s; cin >> s; ll m = 0; ll tm = 0; while (tm <= n) { m++; tm += m; } vvi A(n, vi(m+5, 0)); ll res = 0; A[0][0] = 1; for (ll i = 0; i < n; i++) { for (ll j = 0; j <= m; j++) { if (s[i] == '#') { A[i][j] = 0; continue; } if (i+1 >= n) { res += A[i][j]; res %= MOD; } else { A[i+1][j] += A[i][j]; A[i+1][j] %= MOD; } if (i+j+2 >= n) { res += A[i][j]; res %= MOD; } else { A[i+j+2][j+1] += A[i][j]; A[i+j+2][j+1] %= MOD; } } } cout << res << endl; } signed main() { // DON'T MIX "scanf" and "cin"! ios_base::sync_with_stdio(false); cin.tie(NULL); cout << fixed << setprecision(20); run(); return 0; }