解説

(0xK)(0 \leq x \leq K) における各 xx についての P(x)P(x) の値を愚直に計算していては、実行時間制限に間に合いません。(仮に間に合ったとしても小数誤差の影響が無視できません。)そこで、計算量を落とすための工夫を考えてみます。

まず、p=AN\displaystyle p = \frac{A}{N} とすると、 P(x)=KCxpx(1p)Kx\displaystyle P(x) = {}_KC_{x} p^x(1-p)^{K-x} と表せます。

このとき (0xK1)(0 \leq x \leq K-1) において、 f(x)=P(x+1)P(x)\displaystyle f(x) = \frac{P(x+1)}{P(x)} の値を考えると、

f(x)=P(x+1)P(x)=KCx+1px+1(1p)Kx1KCxpx(1p)Kx=(Kx)p(x+1)(1p)\displaystyle f(x) = \frac{P(x+1)}{P(x)} = \frac{{}_KC_{x+1}p^{x+1}(1-p)^{K-x-1}}{{}_KC_{x}p^{x}(1-p)^{K-x}} = \frac{(K-x)p}{(x+1)(1-p)}

となり、この値は (0xK1)(0 \leq x \leq K-1) において単調減少であることからP(x+1)>P(x)f(x)>1P(x+1) > P(x) \Longleftrightarrow f(x) > 1 を利用して P(x)P(x) が最大となる xx の値の範囲を二分探索で絞りこむことができます。最終的に残った範囲の左端が答えとなり、これは1クエリ当たり時間計算量 O(logK)O(logK) で求められるため実行時間制限に間に合います。