解説
(0≤x≤K) における各 x についての P(x) の値を愚直に計算していては、実行時間制限に間に合いません。(仮に間に合ったとしても小数誤差の影響が無視できません。)そこで、計算量を落とすための工夫を考えてみます。
まず、p=NA とすると、
P(x)=KCxpx(1−p)K−x と表せます。
このとき (0≤x≤K−1) において、
f(x)=P(x)P(x+1) の値を考えると、
f(x)=P(x)P(x+1)=KCxpx(1−p)K−xKCx+1px+1(1−p)K−x−1=(x+1)(1−p)(K−x)p
となり、この値は (0≤x≤K−1) において単調減少であることからP(x+1)>P(x)⟺f(x)>1 を利用して P(x) が最大となる x の値の範囲を二分探索で絞りこむことができます。最終的に残った範囲の左端が答えとなり、これは1クエリ当たり時間計算量 O(logK) で求められるため実行時間制限に間に合います。