from random import random
import matplotlib.pyplot as plt
def factorial(n:int):
    n=int(n)
    if n==1 or n==0:
        return 1
    return factorial(n-1)*n
f=factorial

def combination(n:int, m:int):
    n=int(n)
    m=int(m)
    if m > n :
        n,m = m,n
    return int(f(n)/(f(m)*f(n-m)))
c=combination

def binomial_distribution(k:int, n:int, p:int):
    n=int(n)
    p=float(p)
    k=int(k)
    q=1-p
    return (c(n,k)*(p**k)*(q**(n-k)))
bd=binomial_distribution

n=100
p=0.97

output=[bd(i,n,p) for i in range(n+1)]
index = [i for i in range(n+1)]

fig, ax = plt.subplots()
x_labels = [f"k={i}" for i in index]
bars = ax.bar(x_labels, output)
ax.set_title(f'B({n},{p})')
ax.set_ylabel("P")
ax.set_xlabel("X=k")
i=0
while True:
    if sum(output[i::-1]+output[-1*i-1::1])>= 0.05:
        i-=1
        reject_region = index[i::-1]+index[-1*i-1::1]
        print(f"X={', '.join(str(k) for k in sorted(reject_region))}是拒絕域")
        break
    i+=1

for bar in bars:
    for num in output[i::-1]+output[-1*i-1::1]:
        if bar.get_height()==num:
            bar.set_color("red")

for label in ax.get_xticklabels():
    for index in reject_region:
        if label.get_text() == f"k={index}":
            label.set_color("red")

plt.show()