def distObjIndistBox(n, r): result = 0 for j in range(1, r + 1): s = 0 for i in range(j): s += math.pow(-1, i) * rCombinNoRep(j, i) * math.pow(j - i, n) result += s / fact(j) return result
def rPermutNoRep(n, r): return (fact(n) / fact(n - r))
def distObjDistBox(n, r): d = 1 for x in r: d *= fact(x) return fact(n) / d
def rCombinRep(n, r): return fact(n + r - 1) / (fact(r) * fact(n - 1))
def rCombinNoRep(n, r): return (rPermutNoRep(n, r) / fact(r))
def numOfDerang(num): return fact(num) * probOfDerang(num)
def probOfDerang(num): s = 1 for i in range(1, num + 1): s += (math.pow(-1, i) * (1 / fact(i))) return s