/*
author: madhav_1999 aka orthodoxparadox
18-Jan-2019
00:33:40
*/

#include <bits/stdc++.h>
#include <ext/pb_ds/detail/standard_policies.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

#define dbl long double
#define int ll
#define ll long long
#define pii pair<int, int>
#define fup(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define fnu for(ll i = 0; i < n; i++)
#define rev(Y) reverse(all(Y))
#define oiint ostream_iterator<int>(cout, " ") 
#define pb emplace_back
#define mp make_pair
#define ff first
#define ss second
#define endl '\n'
#define all(a) a.begin(), a.end()
#define initialise(a, x) memset(a, x, sizeof(a))
#define onlyunique(v) v.erase(unique(all(v)), v.end()); //only for sorted vector
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize ("O3")
#pragma GCC optimize ("O2")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define _CRT_SECURE_NO_WARNINGS
#ifdef __APPLE__
#define dbg(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){cerr << name << " : " << arg1 << endl;}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
	const char* comma = strchr(names + 1, ',');
	cerr.write(names, comma - names) << " : " << arg1 << "  ";
	__f(comma + 1, args...);}
#else
#define dbg(...)
#endif
template <typename X> ostream& operator << (ostream& x,const vector<X>& v){for(int i=0;i<v.size();++i) x<<v[i]<<" ";return x;} 
template <typename X> ostream& operator << (ostream& x,const set<X>& v){for(auto it:v) x<<it<<" ";return x;} 
template <typename X, typename Y> ostream& operator << (ostream& x, const pair<X,Y>& v) {x<<v.ff<<" "<<v.ss;return x;} 
typedef tree <int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
struct pair_hash {inline std::size_t operator()(const std::pair<int, int> & v) const {return v.first*31+v.second;}};
const int mod = 1e9 + 7;

int takemod(int a){return ((a%mod)+mod)%mod;}

int fast_exp(int base, int expo) {
	int res=1;
	while(expo>0) {
		if(expo&1) res=(res*base)%mod;
		base=(base*base)%mod;
		expo>>=1;}
	return res;}

int modinv(int a){return takemod(fast_exp(takemod(a), mod-2));}

const int N = 301;
dbl dp[N][N][N];
dbl eps = 1e-12;
int n;

dbl solve(int c1, int c2, int c3)
{
	if(c1 == 0 and c2 == 0 and c3 == 0)
	{
		return 0;
	}
	if(dp[c1][c2][c3] != 0)
	{
		return dp[c1][c2][c3];
	}
	dbl p1 = (dbl)c1 / n;
	dbl p2 = (dbl)c2 / n;
	dbl p3 = (dbl)c3 / n;
	dbl px1 = (dbl)c1 / (c1 + c2 + c3);
	dbl px2 = (dbl)c2 / (c1 + c2 + c3);
	dbl px3 = (dbl)c3 / (c1 + c2 + c3);
	dbl r1 = 0, r2 = 0, r3 = 0;
	if (c1)
	{
		r1 = px1 * (solve(c1 - 1, c2, c3));
	}
	if (c2)
	{
		r2 = px2 * (solve(c1 + 1, c2 - 1, c3));
	}
	if (c3)
	{
		r3 = px3 * (solve(c1, c2 + 1, c3 - 1));
	}
	dbl expe = (dbl)(c1 + c2 + c3) / n;
	expe = 1/expe;
	return dp[c1][c2][c3] = r1 + r2 + r3 + expe;
}

signed main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	#ifdef __APPLE__
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	freopen("error.txt", "w", stderr);
	#endif
	clock_t t1, t2;
	t1 = clock();


	cin >> n;
	int cnt[4]{};
	for(int i = 0; i < n; i++)
	{
		int x;
		cin >> x;
		cnt[x]++;
	}
	cout << fixed << setprecision(20);
	cout << solve(cnt[1], cnt[2], cnt[3]);
	t2 = clock(); cerr << "time taken: " << (t2-t1)/(dbl)CLOCKS_PER_SEC;
	return 0;
}

Measured memory_bytes: 426240