#include <bits/stdc++.h>
using namespace std;

//#include <boost/algorithm/string/join.hpp>
//#include <boost/range/irange.hpp>
//#include <boost/multiprecision/cpp_int.hpp>
#include "boost/multi_array.hpp"
//
//using boost::irange;
//using boost::algorithm::join;
//
// boost::multi_array<int, 3> table;
// table.resize(boost::extents[10][9][8]);

typedef long long ll;
typedef unsigned long long ull;
//typedef long double ld;

typedef map<int, int> mii;
typedef pair<int, int> pii;
typedef pair<double,double> pdd;
typedef set<int> si;
typedef set<ll> sll;
typedef vector<int> vi;
typedef vector<pair<int, int > > vii;
typedef vector<ll> vll;
typedef vector<double> vd;
typedef vector<vi> vvi;
typedef vector<vii> vvii;
typedef vector<vll> vvll;

//constexpr ll MOD = 1e9+7;
template<typename T>constexpr auto inf=numeric_limits<T>::max()/4;
constexpr int INF=inf<int>;
constexpr ll LINF=inf<ll>;

#define Sort(x) sort(begin(x),end(x))
#define Reverse(x) reverse(begin(x),end(x))
#define ABS(a,b) ((a)<(b)?(b)-(a):(a)-(b))
#define nbit(n) (1ull<<(n))
#define _ol3(_1,_2,_3,name,...)name
#define _rep(i,n)_repi(i,0,n)
#define _repi(i,a,b)for(int i=a,i##_l=(b);i<i##_l;++i)
#define REP(...) _ol3(__VA_ARGS__,_repi,_rep,)(__VA_ARGS__)
#define REPR(i,n) for(int i=n-1;i>=0;--i)
#define REPA(i,v) REP(i,(v).size())

// sort(begin(x), end(x), greater<ll>());
// lower_bound(a.begin(), a.end(), val): a[i] ≥ valである最左の位置
// upper_bound(a.begin(), a.end(), val): a[i] > valである最左の位置

// Returns minimum of a and b.
// If a is less b, a is set to b.
template<typename T>
T chmin(T& a, T b) {
  if (a > b) {
    a = b;
  }
  return a;
}

// Returns maximum of a and b.
// If a is less b, a is set to b.
template<typename T>
T chmax(T& a, T b) {
  if (a < b) {
    a = b;
  }
  return a;
}

template <typename T>
void dumpContents(const T& v, const string& msg)
{
  cerr << "### " << msg << " ###\n";
  for (const auto& x : v) {
    cerr << x << " ";
  }
  cerr << endl;
}

struct before_main_function {
  before_main_function() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout<<setprecision(20)<<fixed;
#define endl "\n"
  }
} before_main_function;

// ========== end of template ==========
int N;
boost::multi_array<double, 3> dp;

double get(int i, int j, int k) {
  if (dp[i][j][k] >= 0) {
    return dp[i][j][k];
  }

  double ret = 0;
  if (i>0) ret += (1.0+get(i-1,j,k)) * i/N;
  if (j>0) ret += (1.0+get(i+1,j-1,k)) * j/N;
  if (k>0) ret += (1.0+get(i,j+1,k-1)) * k/N;
  ret += (ret+1)*(N-(i+j+k))/N;

  dp[i][j][k] = ret;
  return ret;
}

int main(int argc, char** argv) {
  cin >> N;

  vi hist(4);
  dp.resize(boost::extents[N+1][N+1][N+1]);
  // dp[i][j][k]
  //   1個がi皿
  //   2個がj皿
  //   3個がk皿
  //   0個がN-i-j-k皿

  REP(i, N) {
    int a;
    cin >> a;
    hist[a]++;
  }

  //REP(i, N+1) {
  //  REP(j, N+1) {
  //    REP(k, N+1) {
  //      dp[i][j][k] = -1;
  //    }
  //  }
  //}
  //dp[0][0][0] = 0;

  REP(k, N+1) {
    REP(j, N+1) {
      if (k+j>N) break;

      REP(i, N+1) {
        if (i+j+k == 0) continue;
        if (i+j+k>N) break;

        dp[i][j][k] += N +
                       (i>0        ? double(i)*dp[i-1][j][k]   : 0) +
                       (j>0 && i<N ? double(j)*dp[i+1][j-1][k] : 0) +
                       (k>0 && j<N ? double(k)*dp[i][j+1][k-1] : 0);
        dp[i][j][k] /= double(i+j+k);

      }

    }

  }



  cout << get(hist[1], hist[2], hist[3]) << endl;

  return 0;
}

/* vim: set expandtab shiftwidth=2 softtabstop=2 : */


Measured memory_bytes: 213376