import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Balls
{
// not necessarily normalized
final static double prob[] = { 0.3, 0.2, 0.2, 0.15, 0.1, 0.05 };
final static int N = prob.length;
int j=2; // which element? (0..N-1)
normalize(prob);
for(int t=0;t<=N;t++) {
double p=computeProb(j,t);
System.
out.
printf("j=%d t=%d p=%.6f\n",j,t,p
); }
}
/**
* Computes probabiity that element j (j=0..N-1, same index as in prob array)
* does not appear in the first pos positions
* computeProb(element, 0) = 1
* computeProb(element, 1) = 1-p_j
* computeProb(element, N) = 0
*/
public static double computeProb(int j, int pos) {
normalize(prob);
double[] p0 = removeAndNormalize(prob, j, false);
return allPermutations(p0, pos);
}
static double allPermutations(double p[], int depth) {
double ac = 0;
if( depth <= 0 ) return 1;
for( int i = 0; i < p.length; i++ )
ac += p[i] * allPermutations(removeAndNormalize(p, i, true), depth - 1);
return ac;
}
// normalizes probabities in place
static void normalize(double[] list) {
double ac = 0;
for( double px : list ) ac += px;
for( int i = 0; i < list.length; i++ ) list[i] /= ac;
}
// removes element of array, and optionally normalizes
// original (untouched) must be already normalized
static double[] removeAndNormalize(double p[], int index, boolean normalize) {
double[] q = new double[p.length - 1];
for( int i = 0, j = 0; i < q.length; i++, j++ ) {
if( i == index ) j++;
q[i] = normalize ? p[j] / (1 - p[index]) : p[j];
}
return q;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgQmFsbHMgCnsKCQoJLy8gbm90IG5lY2Vzc2FyaWx5IG5vcm1hbGl6ZWQKICAgIGZpbmFsIHN0YXRpYyBkb3VibGUgcHJvYltdID0geyAwLjMsIDAuMiwgMC4yLCAwLjE1LCAwLjEsIDAuMDUgfTsKICAgIGZpbmFsIHN0YXRpYyBpbnQgTiA9IHByb2IubGVuZ3RoOwoKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgl7CgkJaW50IGo9MjsgLy8gd2hpY2ggZWxlbWVudD8gKDAuLk4tMSkKCQlub3JtYWxpemUocHJvYik7CgkJU3lzdGVtLm91dC5wcmludGxuKCJwcm9iPSIgKyBBcnJheXMudG9TdHJpbmcocHJvYikpOwoJCWZvcihpbnQgdD0wO3Q8PU47dCsrKSB7CgkJCWRvdWJsZSBwPWNvbXB1dGVQcm9iKGosdCk7CgkJCVN5c3RlbS5vdXQucHJpbnRmKCJqPSVkIHQ9JWQgcD0lLjZmXG4iLGosdCxwKTsKCQl9Cgl9CgogICAgLyoqCiAgICAgKiBDb21wdXRlcyBwcm9iYWJpaXR5IHRoYXQgZWxlbWVudCBqIChqPTAuLk4tMSwgc2FtZSBpbmRleCBhcyBpbiBwcm9iIGFycmF5KQogICAgICogZG9lcyBub3QgYXBwZWFyIGluIHRoZSBmaXJzdCBwb3MgcG9zaXRpb25zCgogICAgICogY29tcHV0ZVByb2IoZWxlbWVudCwgMCkgPSAxCiAgICAgKiBjb21wdXRlUHJvYihlbGVtZW50LCAxKSA9IDEtcF9qIAogICAgICogY29tcHV0ZVByb2IoZWxlbWVudCwgTikgPSAwIAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBjb21wdXRlUHJvYihpbnQgaiwgaW50IHBvcykgewogICAgICAgIG5vcm1hbGl6ZShwcm9iKTsKICAgICAgICBkb3VibGVbXSBwMCA9IHJlbW92ZUFuZE5vcm1hbGl6ZShwcm9iLCBqLCBmYWxzZSk7CiAgICAgICAgcmV0dXJuIGFsbFBlcm11dGF0aW9ucyhwMCwgcG9zKTsKICAgIH0KCiAgICBzdGF0aWMgZG91YmxlIGFsbFBlcm11dGF0aW9ucyhkb3VibGUgcFtdLCBpbnQgZGVwdGgpIHsKICAgICAgICBkb3VibGUgYWMgPSAwOwogICAgICAgIGlmKCBkZXB0aCA8PSAwICkgcmV0dXJuIDE7CiAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSsrICkgCiAgICAgICAgICAgIGFjICs9IHBbaV0gKiBhbGxQZXJtdXRhdGlvbnMocmVtb3ZlQW5kTm9ybWFsaXplKHAsIGksIHRydWUpLCBkZXB0aCAtIDEpOwogICAgICAgIHJldHVybiBhYzsKICAgIH0KCiAgICAvLyBub3JtYWxpemVzIHByb2JhYml0aWVzIGluIHBsYWNlCiAgICBzdGF0aWMgdm9pZCBub3JtYWxpemUoZG91YmxlW10gbGlzdCkgewogICAgICAgIGRvdWJsZSBhYyA9IDA7CiAgICAgICAgZm9yKCBkb3VibGUgcHggOiBsaXN0ICkgICAgICAgICBhYyArPSBweDsKICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKysgKSAgICAgICAgICBsaXN0W2ldIC89IGFjOwogICAgfQoKICAgIC8vIHJlbW92ZXMgZWxlbWVudCBvZiBhcnJheSwgYW5kIG9wdGlvbmFsbHkgbm9ybWFsaXplcyAKICAgIC8vIG9yaWdpbmFsICh1bnRvdWNoZWQpIG11c3QgYmUgYWxyZWFkeSBub3JtYWxpemVkIAogICAgc3RhdGljIGRvdWJsZVtdIHJlbW92ZUFuZE5vcm1hbGl6ZShkb3VibGUgcFtdLCBpbnQgaW5kZXgsIGJvb2xlYW4gbm9ybWFsaXplKSB7CiAgICAgICAgZG91YmxlW10gcSA9IG5ldyBkb3VibGVbcC5sZW5ndGggLSAxXTsKICAgICAgICBmb3IoIGludCBpID0gMCwgaiA9IDA7IGkgPCBxLmxlbmd0aDsgaSsrLCBqKysgKSB7CiAgICAgICAgICAgIGlmKCBpID09IGluZGV4ICkgaisrOwogICAgICAgICAgICBxW2ldID0gbm9ybWFsaXplID8gcFtqXSAvICgxIC0gcFtpbmRleF0pIDogcFtqXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHE7CiAgICB9CiAgICAKCn0=