TopCoder SRM 667 Div1 Medium: CatsOnTheCircle
コード
public class CatsOnTheCircle { public double getProb(int N, int K, int p) { if (p == 1e9 / 2) { return 1.0 / (N - 1); } if (p > 1e9 / 2) { K = N - K; p = (int) 1e9 - p; } double pd = p / 1e9; return turnRight(N - K - 1, K - 1, pd) * (1 - turnRight(N - 2, 1, pd)) + (1 - turnRight(N - K - 1, K - 1, pd)) * turnRight(1, N - 2, pd); } private double turnRight(int L, int R, double p) { double q = p / (1 - p); double r = 1.0 / (1.0 - Math.pow(q, L + R)); return r * Math.pow(q, R) + 1.0 - r; } }