from math import comb
def fisher(a,n,b,m):
    total=a+b;observed=comb(n,a)*comb(m,b)
    return sum(comb(n,x)*comb(m,total-x) for x in range(max(0,total-m),min(n,total)+1)
               if comb(n,x)*comb(m,total-x)<=observed)/comb(n+m,total)
def holm(ps):
    ranked=sorted(enumerate(ps),key=lambda v:v[1]);out=[0.]*len(ps);previous=0.
    for j,(i,p) in enumerate(ranked):
        previous=max(previous,min(1.,(len(ps)-j)*p));out[i]=previous
    return out
def inverse(f,target):
    low,high=0.,1.
    for _ in range(80):
        mid=(low+high)/2
        if f(mid)<target:low=mid
        else:high=mid
    return (low+high)/2
def cp(k,n):
    lo=0. if k==0 else inverse(lambda p:sum(comb(n,j)*p**j*(1-p)**(n-j) for j in range(k,n+1)),.025)
    hi=1. if k==n else inverse(lambda p:sum(comb(n,j)*p**j*(1-p)**(n-j) for j in range(k+1,n+1)),.975)
    return [lo,hi]
def percent(x):return f'{100*x:.1f}%'
def interval(k,n):return ' to '.join(map(percent,cp(k,n)))
def ptext(x):return f'{x:.6f}'
