python中求解(m选择x)=n的有效算法
给定 m:要设计的海报数量python中求解(m选择x)=n的有效算法,python,algorithm,permutation,Python,Algorithm,Permutation,给定 m:要设计的海报数量 n:可用颜色的总数 解决 x:每张海报的颜色数量,以便每张海报具有独特的颜色组合 以等式为准 (n选择x)=m 我已经用python编写了上述问题,下面给出了源代码 factorial = [] def generateList(n): factorial.append(1) factorial.append(1) for i in range(2,n+1): factorial.append(i * factorial[i
n:可用颜色的总数 解决 x:每张海报的颜色数量,以便每张海报具有独特的颜色组合 以等式为准 (n选择x)=m 我已经用python编写了上述问题,下面给出了源代码
factorial = []
def generateList(n):
factorial.append(1)
factorial.append(1)
for i in range(2,n+1):
factorial.append(i * factorial[i-1])
def calculateFac(n,i):
return int((factorial[n]) / (factorial[i] * factorial[n-i]))
def ColorChoice(m,n):
for i in range(1,int(n/2)+1):
if m == calculateFac(n,i):
return i
return -1
def checkChoose(m,n):
generateList(n)
return ColorChoice(m,n)
print (checkChoose(35,7))
上面的解决方案将只适用于小整数,但我需要一个解决方案来适用于较大的数字,例如,当n=47129212243960时
有什么有效的方法来解决这个问题吗?因为(n选择x)==(n选择(n-x))
,而且似乎你想找到最小的x
,我们可以在0
和n/2
之间搜索x
。另外,对于任意的n
和m
,可能不存在这样的x
,但可能您想要的是最小的x
,如果存在的话,使得(n选择x)>=m
,也就是说,最小的x
保证您可以制作m
独特的颜色组合——使用该x
您甚至可以制作超过m
独特的颜色组合
有一个简单的O(n)解决方案,使用(n choose(x+1))/(n choose x)==(n-x)/(x+1)
,可以通过按阶乘展开“choose”表达式,并将其取消
def x(m,n):
n_choose_x = 1
for x in xrange(1, n/2 + 1):
n_choose_x = n_choose_x * (n+1-x) / x
if n_choose_x >= m:
return x
return -1
print(x(70,8))
print(x(71,8))
print(x(57,8))
print(x(56,8))
print(x(55,8))
print("")
print(x(9999999, 47129212243960))
print(x(99999999471292122439609999999, 47129212243960))
print(x(99999999947129212243960999999471292122439609999999, 47129212243960))
这张照片是:
4
-1
4
3
3
1
3
4
如果你可以做一个阶乘的近似值(不需要精确的值),你可以使用。(n选择x)是0,1或者至少是n,所以如果n是47129212243960,那么你至少要设计47万亿张海报。你的问题中有错误吗,或者这只是一个理论难题?你应该使用整数除法。此外,数学模块中还有一个有效的阶乘函数。但是,直接计算(n choose r)序列比通过阶乘(每次使用
math.factorial
计算或使用存储在列表中的值)循环速度更快。此外,如果ColorChoice
函数没有得到精确匹配,它将无法找到i
。这就是你真正想要的吗?如果没有,请考虑将<<代码>=< /代码>改为<代码> > <代码>。有一些想法。感谢您提供简单的解决方案。n\u choose\u x>=m应该是n\u choose\u x==m。因为如果我们使用m=221和n=11的情况,那么n_choose_x>=m条件将不起作用@Amit m=221和n=12如此整洁-太棒了!