|
发表于 2019-12-29 22:05:20
|
显示全部楼层
本帖最后由 阴阳神万物主 于 2019-12-31 01:41 编辑
抢地板
数学规律,我总算回忆起来了!!!
组合数的计算因为怕超出内存限制,所以就没用杨辉三角,不然还能快一些
- def solve(n:'可能包含重复数字的排列')->'编号':
- def a(n,m):#m<=n
- res = 1
- for i in range(n,n-m,-1):
- res *= i
- return res
- def c(n,m):#m<=n
- res = 1
- for i in range(n,m,-1):
- res *= i
- for i in range(n-m,1,-1):
- res //= i
- return res
-
- d = [str(x) for x in n]
- b = dict([(each,d.count(each)) for each in set(d)])
- res = 1
- le = len(d)
- for i in range(le):
- dlt = 0
- le -= 1
- for j in [x for x in b if b[x] and x<d[i]]:
- each = 0
- b[j] -= 1
- an = 0
- for n in b:
- if b[n] > 1:
- each = each*c(le,b[n]) if each else c(le,b[n])
- le -= b[n]
- dlt -= b[n]
- elif b[n]:
- an += 1
- each = each*a(an,an) if each else a(an,an)
- #print('调试',each,b)
- le -= dlt
- dlt = 0
- res += each
- b[j] += 1
- b[d[i]] -= 1
- return res
- if __name__ == '__main__':
- print('示例1 输出:',solve([1,4,2,2]))
- print('示例2 输出:',solve([1,6,5,3,1]))
- print('自测 6 输出:',solve([1,2,2,1,1]))
- print('自测 30 输出:',solve([3,2,2,1,1]))
- print('自测大数据,全排列数为c(2000,1000) 输出:',solve([1,2]*1000))
复制代码
这时间复杂度我就有点不会求了。可有人愿意告知于我呀?
排列数公式:
组合数公式:
|
评分
-
查看全部评分
|