
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define N 5005
#define M 600200
#define U 1000000
#define inf 0x3f3f3f3f
#define mod 1000000007
#define LL long long
#define ULL unsigned long long
#define ls (i << 1)
#define rs (ls | 1)
#define md (ll + rr >> 1)
#define lson ll, md, ls
#define rson md + 1, rr, rs
#define MP make_pair
int dp[N][N], num[N][N], pre[N], nxt[N], san[N], a[N];
int main(){
int n;
while(scanf("%d", &n) != EOF){
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
san[i] = a[i];
}
sort(san + 1, san + 1 + n);
int cnt = unique(san + 1, san + 1 + n) - san - 1;
for(int i = 1; i <= n; ++i)
a[i] = lower_bound(san + 1, san + 1 + cnt, a[i]) - san;
for(int i = n; i >= 1; --i){
memset(nxt, 0, sizeof nxt);
memset(pre, 0, sizeof pre);
dp[i][i] = 1, num[i][i] = 1;
int mx = 0, cc = 1;
for(int j = i + 1; j <= n; ++j){
if(a[i] == a[j]){
dp[i][j] = mx + 2;
num[i][j] = cc;
}
if(a[i] >= a[j]){
if(!nxt[a[j]]) nxt[a[j]] = j;
int L = nxt[a[j]], p = pre[a[j]], R = j;
pre[a[j]] = j;
if(dp[L][R] > mx){
mx = dp[L][R];
cc = num[L][R];
}
else if(dp[L][R] == mx){
if(p && dp[L][p] == mx){
cc -= num[L][p];
if(cc < 0) cc += mod;
}
cc += num[L][R];
if(cc >= mod) cc -= mod;
}
}
}
}
int mx = 0, ans = 0;
for(int i = 1; i <= cnt; ++i){
int L = -1, R = -1;
for(int j = 1; j <= n; ++j){
if(a[j] == i){
if(!~L) L = j;
R = j;
}
}
if(L == -1) continue;
if(dp[L][R] > mx){
mx = dp[L][R];
ans = num[L][R];
}
else if(dp[L][R] == mx)
ans = (ans + num[L][R]) % mod;
}
printf("%d %d\n", mx, ans);
}
return 0;
}