import java.io.OutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Arrays; import java.io.BufferedWriter; import java.io.Writer; import java.io.OutputStreamWriter; import java.util.InputMismatchException; import java.io.IOException; import java.io.InputStream; /** * Built using CHelper plug-in * Actual solution is at the top */ public class Main { public static void main(String[] args) { InputStream inputStream = System.in; OutputStream outputStream = System.out; InputReader in = new InputReader(inputStream); OutputWriter out = new OutputWriter(outputStream); E solver = new E(); solver.solve(1, in, out); out.close(); } static class E { int M = 1000 * 1000 * 1000 + 7; int[] a; int[][] sortedMem; int[][] dpMem; long[] factorial; long[][] binom; OutputWriter out; boolean sorted(int l, int r) { if (l == r) return true; if (sortedMem[l][r] != -1) return sortedMem[l][r] == 1; boolean res = a[l] < a[l + 1] && sorted(l + 1, r); sortedMem[l][r] = res ? 1 : 0; return res; } int dp(int index, int k) { if (index + k > a.length) return 0; if (k == 0) return index == a.length ? 1 : 0; if (index == a.length) return k == 0 ? 1 : 0; if (!sorted(index, index + k - 1)) return 0; if (dpMem[index][k] != -1) return dpMem[index][k]; long res = 0; for (int remaining = 0; remaining <= k; remaining++) { long temp = factorial[remaining] * binom[k][remaining] % M; res += temp * dp(index + k, remaining) % M; res %= M; } return dpMem[index][k] = (int) res; } public void solve(int testNumber, InputReader in, OutputWriter out) { this.out = out; int n = in.readInt(); a = IOUtils.readIntArray(in, n); sortedMem = new int[n][n]; ArrayUtils.fill(sortedMem, -1); dpMem = new int[n][n + 1]; ArrayUtils.fill(dpMem, -1); factorial = IntegerUtils.generateFactorial(n + 1, M); binom = IntegerUtils.generateBinomialCoefficients(n + 1, M); int res = 0; for (int start = 1; start <= a.length; start++) { int temp = dp(0, start); res += temp; res %= M; } out.printLine(res); } } static class InputReader { private InputStream stream; private byte[] buf = new byte[1024]; private int curChar; private int numChars; private InputReader.SpaceCharFilter filter; public InputReader(InputStream stream) { this.stream = stream; } public int read() { if (numChars == -1) { throw new InputMismatchException(); } if (curChar >= numChars) { curChar = 0; try { numChars = stream.read(buf); } catch (IOException e) { throw new InputMismatchException(); } if (numChars <= 0) { return -1; } } return buf[curChar++]; } public int readInt() { int c = read(); while (isSpaceChar(c)) { c = read(); } int sgn = 1; if (c == '-') { sgn = -1; c = read(); } int res = 0; do { if (c < '0' || c > '9') { throw new InputMismatchException(); } res *= 10; res += c - '0'; c = read(); } while (!isSpaceChar(c)); return res * sgn; } public boolean isSpaceChar(int c) { if (filter != null) { return filter.isSpaceChar(c); } return isWhitespace(c); } public static boolean isWhitespace(int c) { return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1; } public interface SpaceCharFilter { public boolean isSpaceChar(int ch); } } static class OutputWriter { private final PrintWriter writer; public OutputWriter(OutputStream outputStream) { writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream))); } public OutputWriter(Writer writer) { this.writer = new PrintWriter(writer); } public void close() { writer.close(); } public void printLine(int i) { writer.println(i); } } static class ArrayUtils { public static void fill(int[][] array, int value) { for (int[] row : array) { Arrays.fill(row, value); } } } static class IOUtils { public static int[] readIntArray(InputReader in, int size) { int[] array = new int[size]; for (int i = 0; i < size; i++) { array[i] = in.readInt(); } return array; } } static class IntegerUtils { public static long[][] generateBinomialCoefficients(int n, long module) { long[][] result = new long[n + 1][n + 1]; if (module == 1) { return result; } for (int i = 0; i <= n; i++) { result[i][0] = 1; for (int j = 1; j <= i; j++) { result[i][j] = result[i - 1][j - 1] + result[i - 1][j]; if (result[i][j] >= module) { result[i][j] -= module; } } } return result; } public static long[] generateFactorial(int count, long module) { long[] result = new long[count]; if (module == -1) { if (count != 0) { result[0] = 1; } for (int i = 1; i < count; i++) { result[i] = result[i - 1] * i; } } else { if (count != 0) { result[0] = 1 % module; } for (int i = 1; i < count; i++) { result[i] = (result[i - 1] * i) % module; } } return result; } } }