#include <bits/stdc++.h>
using namespace std;
void preprocess(void) { return; }
struct FT {
  vector<long long> s;
  FT(int n) : s(n) {}
  void update(int pos, long long dif) {
    for (; pos < (int)(s).size(); pos |= pos + 1) s[pos] += dif;
  }
  long long query(int pos) {
    long long res = 0;
    for (; pos > 0; pos &= pos - 1) res += s[pos - 1];
    return res;
  }
  int lower_bound(long long sum) {
    if (sum <= 0) return -1;
    int pos = 0;
    for (int pw = 1 << 25; pw; pw >>= 1) {
      if (pos + pw <= (int)(s).size() && s[pos + pw - 1] < sum)
        pos += pw, sum -= s[pos - 1];
    }
    return pos;
  }
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.precision(20);
  preprocess();
  int n;
  cin >> n;
  vector<int> ar(n);
  for (auto i = (0); i < n; i++) cin >> ar[i];
  sort(ar.begin(), ar.end());
  struct FT tree(100004);
  map<int, int> s1;
  vector<int> s2;
  int cnt1 = 0, cnt2 = 0;
  for (auto i = (0); i < n; i++) {
    for (auto j = (0); j < n; j++) {
      if (i == j) continue;
      if (ar[i] - ar[j] > 0) {
        s1[ar[i] - ar[j]]++;
        cnt1++;
      } else {
        s2.push_back(ar[j] - ar[i]);
        cnt2++;
      }
    }
  };
  ;
  for (auto x : s1) {
    for (auto y : s1) {
      if (x.first == 0 || y.first == 0) continue;
      ;
      tree.update(x.first + y.first, x.second * y.second);
    }
  }
  sort(s2.begin(), s2.end());
  long long ans = 0;
  for (auto i = (0); i < (int)(s2).size(); i++) {
    ;
    ans += tree.query(s2[i]);
  }
  long long tot = ((long long)cnt1 * (long long)cnt2 * (long long)cnt1);
  long double fans = (long double)ans / tot;
  ;
  cout << fans << endl;
}
