Problem p03169 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
#define all(x) (x).begin(), (x).end()
#pragma GCC optimize("Ofast")
using namespace std;
typedef long long int ll;
typedef long double ld;
const ll INF = (1LL << 62);
const ld pi = acosl((ld)-1);
const ll mod = 1000000007;
// const ll mod = 1234567;
const int dx[4] = {0, 1, 0, -1};
const int dy[4] = {1, 0, -1, 0};
const int ddx[8] = {1, 0, -1, -1, -1, 0, 1, 1};
const int ddy[8] = {1, 1, 1, 0, -1, -1, -1, 0};
#define endn "\n"
#define TO_STRING(VariableName) #VariableName

template <typename T> ostream &operator<<(ostream &out, const vector<T> &v) {
  rep(i, (int)v.size() - 1) cout << v[i] << " ";
  cout << v[(int)v.size() - 1];
  return out;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &out, const map<T1, T2> &p) {
  out << "(" << p.first << ", " << p.second << ")";
  return out;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &out, const pair<T1, T2> &p) {
  out << "(" << p.first << ", " << p.second << ")";
  return out;
}
template <class T> void debag(const T &obj) { cout << obj << endl; }

bool solve() {
  ll n;
  cin >> n;
  ll A = 0;
  ll B = 0;
  ll C = 0;
  rep(i, n) {
    ll a;
    cin >> a;
    if (a == 1)
      A++;
    if (a == 2)
      B++;
    if (a == 3)
      C++;
  }

  ld dp[n + 1][n + 1][n + 1];
  rep(i, n + 1) rep(j, n + 1) rep(k, n + 1) dp[i][j][k] = 0;

  rep(i, n + 1) rep(j, n + 1) rep(k, n + 1) {
    dp[i][j][k] = 0;
    if (i + j + k == 0)
      continue;
    if (i > 0)
      dp[i][j][k] += dp[i - 1][j + 1][k] * (ld)((ld)i / (ld)(i + j + k));
    if (j > 0)
      dp[i][j][k] += dp[i][j - 1][k + 1] * (ld)((ld)j / (ld)(i + j + k));
    if (k > 0)
      dp[i][j][k] += dp[i][j][k - 1] * (ld)((ld)k / (ld)(i + j + k));
    // cout<<i<<" "<<j<<" "<<k<<" "<<dp[i][j][k]<<endl;
    dp[i][j][k] += (ld)n / (ld)(i + j + k);
  }

  cout << dp[C][B][A] << endl;

  return false;
}

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout << fixed << setprecision(30);
  solve();
}


Fixed submission:
#include <bits/stdc++.h>
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
#define all(x) (x).begin(), (x).end()
#pragma GCC optimize("Ofast")
using namespace std;
typedef long long int ll;
typedef long double ld;
const ll INF = (1LL << 62);
const ld pi = acosl((ld)-1);
const ll mod = 1000000007;
// const ll mod = 1234567;
const int dx[4] = {0, 1, 0, -1};
const int dy[4] = {1, 0, -1, 0};
const int ddx[8] = {1, 0, -1, -1, -1, 0, 1, 1};
const int ddy[8] = {1, 1, 1, 0, -1, -1, -1, 0};
#define endn "\n"
#define TO_STRING(VariableName) #VariableName

template <typename T> ostream &operator<<(ostream &out, const vector<T> &v) {
  rep(i, (int)v.size() - 1) cout << v[i] << " ";
  cout << v[(int)v.size() - 1];
  return out;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &out, const map<T1, T2> &p) {
  out << "(" << p.first << ", " << p.second << ")";
  return out;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &out, const pair<T1, T2> &p) {
  out << "(" << p.first << ", " << p.second << ")";
  return out;
}
template <class T> void debag(const T &obj) { cout << obj << endl; }

bool solve() {
  ll n;
  cin >> n;
  ll A = 0;
  ll B = 0;
  ll C = 0;
  rep(i, n) {
    ll a;
    cin >> a;
    if (a == 1)
      A++;
    if (a == 2)
      B++;
    if (a == 3)
      C++;
  }

  vector<vector<vector<ld>>> dp(
      n + 2, vector<vector<ld>>(n + 2, vector<ld>(n + 2, 0)));
  rep(i, n + 1) rep(j, n + 1) rep(k, n + 1) dp[i][j][k] = 0;

  rep(i, n + 1) rep(j, n + 1) rep(k, n + 1) {
    dp[i][j][k] = 0;
    if (i + j + k == 0)
      continue;
    if (i > 0)
      dp[i][j][k] += dp[i - 1][j + 1][k] * (ld)((ld)i / (ld)(i + j + k));
    if (j > 0)
      dp[i][j][k] += dp[i][j - 1][k + 1] * (ld)((ld)j / (ld)(i + j + k));
    if (k > 0)
      dp[i][j][k] += dp[i][j][k - 1] * (ld)((ld)k / (ld)(i + j + k));
    // cout<<i<<" "<<j<<" "<<k<<" "<<dp[i][j][k]<<endl;
    dp[i][j][k] += (ld)n / (ld)(i + j + k);
  }

  cout << dp[C][B][A] << endl;

  return false;
}

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout << fixed << setprecision(30);
  solve();
}