MOD = 1_000_000_007
def merge(a, b):
if a[0] > b[0]:
return a
if b[0] > a[0]:
return b
if a[0] == 0:
return (0, 0)
return (a[0], (a[1] + b[1]) % MOD)
class SegTree:
def __init__(self, n):
self.size = 1
while self.size < n:
self.size *= 2
self.tree = [(0, 0)] * (2 * self.size)
def update(self, pos, val):
pos += self.size
self.tree[pos] = merge(self.tree[pos], val)
pos //= 2
while pos:
self.tree[pos] = merge(self.tree[2 * pos], self.tree[2 * pos + 1])
pos //= 2
def query(self, left, right):
if left > right:
return (0, 0)
left += self.size
right += self.size
res_left = (0, 0)
res_right = (0, 0)
while left <= right:
if left & 1:
res_left = merge(res_left, self.tree[left])
left += 1
if not (right & 1):
res_right = merge(self.tree[right], res_right)
right -= 1
left //= 2
right //= 2
return merge(res_left, res_right)
def solve():
n = int(input())
arr = list(map(int, input().split()))
vals = sorted(set(arr))
comp = {v: i for i, v in enumerate(vals)}
m = len(vals)
inc_len = [0] * n
inc_cnt = [0] * n
dec_len = [0] * n
dec_cnt = [0] * n
inc_tree = SegTree(m)
dec_tree = SegTree(m)
for i in range(n - 1, -1, -1):
p = comp[arr[i]]
best_len, ways = inc_tree.query(p + 1, m - 1)
if best_len == 0:
inc_len[i] = 1
inc_cnt[i] = 1
else:
inc_len[i] = best_len + 1
inc_cnt[i] = ways
inc_tree.update(p, (inc_len[i], inc_cnt[i]))
best_len, ways = dec_tree.query(0, p - 1)
if best_len == 0:
dec_len[i] = 1
dec_cnt[i] = 1
else:
dec_len[i] = best_len + 1
dec_cnt[i] = ways
dec_tree.update(p, (dec_len[i], dec_cnt[i]))
best = 0
for i in range(n):
best = max(best, inc_len[i] + dec_len[i] - 1)
total = 0
for i in range(n):
if inc_len[i] + dec_len[i] - 1 == best:
total = (total + inc_cnt[i] * dec_cnt[i]) % MOD
total = total * pow(2, n - best, MOD) % MOD
print(best, total)
solve()