美团射击题目

看到别人描述的一道美团计算射击概率再最后求模运算的题,自己写了写也不知道对不对。

def shijie(N, b):
    res_0 = 1
    res_1 = 0
    res_2 = 0
    for i in range(N):
        res_0 *= (1/b[i])
    for i in range(N):
        temp = (1-1/b[i])
        for j in range(N):
            if i == j:
                continue
            temp *= (1/b[j])
        res_1 += temp
    for i in range(N): # 三重循环大法求脱靶(命中?记不住了)两次的概率
        temp = (1-1/b[i])
        for j in range(i, N):
            temp2 = temp*(1-1/b[j])
            if j == i:
                continue
            for k in range(N):
                if j == k or i == k:
                    continue
                temp2 *= (1/b[k])
            res_2 += temp2
        # res_2 += temp
    print("res_0:= "+str(res_0) + " res_1:= " + str(res_1) + " res_2:= " + str(res_2))
    res_0 = mod(1/res_0)
    res_1 = mod(1/res_1)
    res_2 = mod(1/res_2)
    return res_0, res_1, res_2

def mod(x):
    mod = 998244353
    time = 1
    while(((mod*time+1)/x)*10%10 != 0): # 基于基底的求逆运算
        time += 1
    return ((mod*time+1)/x)%mod

在我自己试了下三次射击的情况下应该是对的,题目给的两次射击样例也没问题,但是总觉得哪里缺点啥,先这么保存着。
因为python没有数据类型限制问题,所以用的python不是Java,试了下这个模的基底都比Java long类型长。

你可能感兴趣的:(leetCode,刷题)