import java.io.*;
import java.util.*;
import java.math.BigInteger;
import java.util.Map.Entry;

import static java.lang.Math.*;

public class D extends PrintWriter {

	void run() {
		int n = nextInt(), m = 0;
		int[] a = nextArray(n);

		for (int i = 23; i < n; i++) {
			int j = rnd.nextInt(i);
			a[i] ^= a[j];
			a[j] ^= a[i];
			a[i] ^= a[j];
		}

		Arrays.sort(a);

		for (int val : a) {
			m = max(m, val + 1);
		}

		// int[] la = new int[m];
		// for (int val : a) {
		// ++la[val];
		// }
		//
		// for (int i = 1; i < m; i++) {
		// la[i] += la[i - 1];
		// }

		int[] d = new int[m];

		for (int i = 0; i < n; i++) {
			int val = a[i];
			for (int j = 0; j < i; j++) {
				++d[val - a[j]];
			}
		}

		long[] dp = new long[m];

		for (int i = 0; i < m; i++) {
			for (int j = 1; j < i; j++) {
				dp[i] += ((long) d[j]) * d[i - j];
			}
		}

		long[] cd = new long[m];

		for (int i = 1; i < m; i++) {
			cd[i] += cd[i - 1] + dp[i];
		}

		// println(Arrays.toString(d));
		// println(Arrays.toString(dp));
		// println(Arrays.toString(cd));
		long cnt = 0;

		for (int i = 0; i < n; i++) {
			int val = a[i];
			for (int j = 0; j < i; j++) {
				int t = val - a[j];
				cnt += cd[t - 1];
			}
		}

		double all = n * (n - 1) / 2;

		all = all * all * all;

		println(cnt / all);
	}

	void skip() {
		while (hasNext()) {
			next();
		}
	}

	int[][] nextMatrix(int n, int m) {
		int[][] matrix = new int[n][m];
		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
				matrix[i][j] = nextInt();
		return matrix;
	}

	String next() {
		while (!tokenizer.hasMoreTokens())
			tokenizer = new StringTokenizer(nextLine());
		return tokenizer.nextToken();
	}

	boolean hasNext() {
		while (!tokenizer.hasMoreTokens()) {
			String line = nextLine();
			if (line == null) {
				return false;
			}
			tokenizer = new StringTokenizer(line);
		}
		return true;
	}

	int[] nextArray(int n) {
		int[] array = new int[n];
		for (int i = 0; i < n; i++) {
			array[i] = nextInt();
		}
		return array;
	}

	int nextInt() {
		return Integer.parseInt(next());
	}

	long nextLong() {
		return Long.parseLong(next());
	}

	double nextDouble() {
		return Double.parseDouble(next());
	}

	String nextLine() {
		try {
			return reader.readLine();
		} catch (IOException err) {
			return null;
		}
	}

	public D(OutputStream outputStream) {
		super(outputStream);
	}

	static BufferedReader reader;
	static StringTokenizer tokenizer = new StringTokenizer("");
	static Random rnd = new Random();
	static boolean OJ;

	public static void main(String[] args) throws IOException {
		OJ = System.getProperty("ONLINE_JUDGE") != null;
		D solution = new D(System.out);
		if (OJ) {
			reader = new BufferedReader(new InputStreamReader(System.in));
			solution.run();
		} else {
			reader = new BufferedReader(new FileReader(new File(D.class.getName() + ".txt")));
			long timeout = System.currentTimeMillis();
			while (solution.hasNext()) {
				solution.run();
				solution.println();
				solution.println("----------------------------------");
			}
			solution.println("time: " + (System.currentTimeMillis() - timeout));
		}
		solution.close();
		reader.close();
	}
}