#include #include #include #include #include #include #include long factorial(int x){ long s = 1; while ( x > 1) { s += x--; } return s; } int solve(int A_size, int* A) { // Return the sum of S(S(A)) modulo 10^9+7. int finalsum = 0; long b_size = factorial(A_size); int *b = malloc(sizeof(int) * b_size); int maxfind = 0; int bp = 0; // for( int i =0; i < A_size; i++){ // printf(">> %i , %d\n",i, A[i]); // } for (int k = 0; k < A_size; k++) { for (int i = 0; i < (A_size - k); i++) { // b[i+j] = A[i] + A[j]; int j = i + k; maxfind = 0; for (int find = i; find <= j; find++){ maxfind = (A[find] > maxfind)? A[find]: maxfind; } b[bp] = maxfind; // printf(">> %i, %d, %d => %d, %d\n",k, i, j,bp, b[bp]); bp++; } } long c_size = factorial(b_size); int *c = malloc(sizeof(int) * c_size); int cp = 0; // printf(">> c_size %ld\n",c_size); // for( int i =0; i < b_size; i++){ // printf(">> %i , %d\n",i, b[i]); // } for (int k = 0; k < b_size; k++) { for (int i = 0; i < (b_size - k); i++) { // b[i+j] = A[i] + A[j]; int j = i + k; maxfind = 0; for (int find = i; find <= j; find++){ maxfind = (b[find] > maxfind)? b[find]: maxfind; } c[cp] = maxfind; // printf(">> %i, %d, %d => %d, %d\n",k, i, j,cp, c[bp]); cp++; } } for( int i =0; i < c_size; i++){ // printf(">> %i , %d\n",i, c[i]); finalsum += c[i]; } return finalsum; } int main() { int n; scanf("%i", &n); int *A = malloc(sizeof(int) * n); for (int a_i = 0; a_i < n; a_i++) { scanf("%i",&A[a_i]); } int result = solve(n, A); printf("%d\n", result); return 0; }