/************************************************** ** Author: Aditya Goel * ** NIT, Kurukshetra * ** INDIA * **************************************************/ #include using namespace std; #define MOD 1000000007 //NA #define inf 0x3f3f3f3f #define ll long long int #define dt ll #define all(c) c.begin(), c.end() #define dcl(a) memset(a,0,sizeof(a)) #define rep(i,a,b) for(dt i=a;i<=(dt)(b);i++) #define tr(container, it) for(vector
:: iterator it= container.begin(); it!=container.end(); it++) #define trp(container, it) for(vector > :: iterator it = container.begin(); it!=container.end(); it++) #define tra(container, it) for(typeof(container.begin()) it = container.begin(); it!=container.end(); it++) #define scanll(a) scanf("%lld",&a); #define scani(a) scanf("%d",&a); #define scand(a) scanf("%lf",&a); #define cc1(a)cout<<#a<<": "< //NA #define mp(a,b) make_pair(a,b) #define pb push_back //NA #define gc getchar //NA #define F first #define S second #define vi vector #define vii vector > #define pii pair #define plii pair, int> #define piii pair #define viii vector > #define vl vector #define vll vector > #define pll pair #define pli pair #include #include #include using namespace std::tr1; const int mod = 1e9 + 7; ll gcd (ll a, ll b) { return (!b ? a : gcd(b, a % b)); } int ADD(int a, int b, int m = mod) { int s = a; s += b; if( s >= m ) s -= m; return s; } int MUL(int a, int b, int m = mod) { return (1LL * a * b % m); } int power(int a, int b, int m = mod) { int res = 1; while( b ) { if( b & 1 ) { res = 1LL * res * a % m; } a = 1LL * a * a % m; b /= 2; } return res; } int DIV(int a, int b, int m = mod) { return MUL(a, power(b, m - 2)); } const int SIZE = 1e5+10; ll fac[SIZE], inv[SIZE]; void build_inverse_modulo() { assert(MOD >= SIZE); fac[0] = 1; rep(i, 1, SIZE) { fac[i] = fac[i-1] * i % MOD; } inv[SIZE - 1] = power(fac[SIZE - 1], MOD-2, MOD); for(int i = SIZE - 2; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % MOD; for(int i = SIZE - 1;i > 0; i--) inv[i] = inv[i] * fac[i - 1] % MOD; } vi primes; bitset<10000010> bs; ll sieve_size; void createSieve(ll upperBound) { bs.set(); sieve_size = upperBound + 1; bs[0] = bs[1] = 0; for(ll i = 2; i <= sieve_size; i++) { if(bs[i]) { for(ll j = i * i; j <= sieve_size; j += i) { bs[j] = 0; } primes.push_back((int)i); } } } bool isPrime(ll n) { if(n <= sieve_size) { return bs[n]; } for(ll i = 0; i < (int)primes.size(); i++) { if(n % primes[i] == 0) { return false; } } return true; } /*int solve(vector < int > m, int n, int cur_pos) { if(cur_pos == n) { return 1; } ll ans = 1; if(m[cur_pos] >= m[cur_pos - 1]) { } }*/ int main(){ int n; cin >> n; int C[n+1][n+1]; int i, j; // Caculate value of Binomial Coefficient in bottom up manner for (i = 0; i <= n; i++) { for (j = 0; j <= i; j++) { // Base Cases if (j == 0 || j == i) C[i][j] = 1; // Calculate value using previosly stored values else C[i][j] = ADD(C[i-1][j-1], C[i-1][j]); } } ll p[n + 5]; memset(p, 0, sizeof p); p[0] = 1; for(int i = 1; i<= n; i++) { for(int k = 0; k <= i; k++) { p[i] = ADD(p[i], C[i][k]); } } vector m(n); for(int m_i = 0; m_i < n; m_i++){ cin >> m[m_i]; } //cout << solve(m, n, 1); // your code goes here ll ans = 1; for(int i = 0; i < n; i++) { int cnt = 0; while(i < n - 1 and m[i] < m[i + 1]) { i++; cnt++; } ans = MUL(ans, p[cnt]); } cout << ans << "\n"; return 0; }