#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int kMod = 1e9+7, kMaxN = 1e5+5;
int pow(int a, int p) {
int rez = 1;
while (p) {
if (p & 1) {
rez = (1LL * rez * a) % kMod;
}
a = (1LL * a * a) % kMod;
p >>= 1;
}
return rez;
}
int fact[kMaxN], inv_fact[kMaxN];
int num_ways[kMaxN];
void init() {
fact[0] = 1;
for (int i = 1; i < kMaxN; i += 1) {
fact[i] = (1LL * fact[i - 1] * i) % kMod;
}
inv_fact[kMaxN - 1] = pow(fact[kMaxN - 1], kMod - 2);
inv_fact[0] = 1;
for (int i = kMaxN - 2; i; i -= 1) {
inv_fact[i] = (1LL * (i + 1) * inv_fact[i + 1]) % kMod;
}
num_ways[1] = 1;
for (int i = 2; i < kMaxN; i += 1) {
int current_ways = (1LL * i * (i - 1) / 2) % kMod;
num_ways[i] = (1LL * num_ways[i - 1] * current_ways) % kMod;
}
}
int comb(int n, int k) {
int rez = 1;
rez = (1LL * rez * fact[n]) % kMod;
rez = (1LL * rez * inv_fact[k]) % kMod;
rez = (1LL * rez * inv_fact[n - k]) % kMod;
return rez;
}
int main() {
init();
int n; cin >> n;
vector<int> elements;
for (int i = 1; i <= n; i += 1) {
int x; cin >> x;
elements.push_back(x);
}
int answer = 1;
sort(elements.begin(), elements.end());
for (int left = 0; left < int(elements.size()); ) {
int right = left;
while (right < int(elements.size()) and elements[left] == elements[right]) {
right += 1;
}
int bonus = 0;
if (left == 0) {
bonus = 1;
} else {
// O(N) overall
for (int un_matched = 1; un_matched <= right - left; un_matched += 1) {
int matched = right - left - un_matched;
bonus = (bonus + 1LL * comb(left + matched - 1, matched) * un_matched) % kMod;
}
}
cout << right - left << ' ' << num_ways[right - left] << '\n';
bonus = (1LL * bonus * num_ways[right - left]) % kMod;
answer = (1LL * answer * bonus) % kMod;
left = right;
}
cout << answer << '\n';
return 0;
}