MOD = 10**9 + 7 def mod_pow(a, b, mod): a %= mod result = 1 while b > 0: if b % 2 == 1: result = (result * a) % mod a = (a * a) % mod b //= 2 return result def main(): import sys input = sys.stdin.read().split() N = int(input[0]) A = list(map(int, input[1:N+1])) # Compute product2: product of A_i^sum_{j>i} A_j mod MOD sum_j = [0] * (N + 1) for i in range(N-1, -1, -1): sum_j[i] = (sum_j[i+1] + A[i]) % (MOD-1) # Using MOD-1 for Fermat's little theorem product2 = 1 for i in range(N): s = sum_j[i+1] if s == 0: continue a = A[i] product2 = (product2 * mod_pow(a, s, MOD)) % MOD # Find the minimum term # Sort the array and check first 200 elements sorted_A = sorted(A) min_term = None K = 200 for i in range(min(K, len(sorted_A))): for j in range(i+1, min(i+1 + K, len(sorted_A))): a = sorted_A[i] b = sorted_A[j] term = (a + b) * mod_pow(a, b, MOD) if min_term is None or term < min_term: min_term = term original_A = A for i in range(len(original_A)): for j in range(i+1, len(original_A)): a = original_A[i] b = original_A[j] term = (a + b) * mod_pow(a, b, MOD) if term == min_term: min_val = term break else: continue break min_val_mod = min_val % MOD denominator = min_val_mod # Compute product1 and product2 combined product_total = 1 for i in range(len(original_A)): a = original_A[i] for j in range(i+1, len(original_A)): b = original_A[j] term = ((a + b) * mod_pow(a, b, MOD)) % MOD product_total = (product_total * term) % MOD # Compute inverse of denominator inv_denominator = mod_pow(denominator, MOD-2, MOD) result = (product_total * inv_denominator) % MOD print(result) if __name__ == '__main__': main()