4
public double getProbability(int[] balls) {5
double[] fact = new double[25];7
for (int i = 1; i <= 24; i++) {8
fact[i] = i * fact[i - 1];10
int need = Arrays.stream(balls).sum() / 2;11
return solve(0, 0, need, new int[balls.length], balls, fact) / all;14
private double solve(int idx, int got, int need, int[] cur, int[] balls, double[] fact) {17
double a = fact[need];18
double b = fact[need];19
for (int i = 0; i < cur.length; i++) {20
if (cur[i] == balls[i]) {22
} else if (cur[i] == 0) {26
b /= fact[balls[i] - cur[i]];29
return colors == 0 ? a * b : 0;31
if (idx == balls.length || got > need) {35
for (int i = 0; i <= balls[idx]; i++) { // for this level of ball, try to take 0 to balls[idx]37
ans += solve(idx + 1, got + i, need, cur, balls, fact);