- 首先使所有字母数字:
- 将这些数字变量称为 ...X3,X2,X1
- 26 是 X1,5 是 X2,1 是 X3(注意,从右到左)
现在来看看神奇的公式:
即使在最坏的情况下,也使用示例和速度演示进行编码:
def comb(n,k): #returns combinations
p = 1 #product
for i in range(k):
p *= (n-i)/(i+1)
return p
def solve(string):
x = []
for letter in string:
x.append(ord(letter)-96) #convert string to list of integers
x = list(reversed(x)) #reverse the order of string
#Next, the magic formula
return x[0]+sum(comb(26,i)-comb(26-x[i-1]+1,i)*(1-i/(26-x[i-1]+1)) for i in range(2,len(x)+1))
solve('bhp')
764.0
>>> solve('afkp')
3996.0
>>> solve('abcdefghijklmnopqrstuvwxyz')
67108863.0
>>> solve('hpz')
2090.0
>>> solve('aez')
441.0
>>> if 1:
s = ''
for a in range(97,97+26):
s += chr(a)
t = time.time()
for v in range(1000):
temp = solve(s)
print (time.time()-t)
0.1650087833404541
为了理解我对这个公式的解释,我需要回顾一下帕斯卡三角形和二项式定理中的一个数学现象:
这是帕斯卡三角形:
从右上到左下,首先有一个 1 的序列。然后是一个计数序列。下一个序列是计数的总和。这些被称为三角数。下一个序列是三角形数的总和,称为四面体数,这种模式一直持续下去。
现在对于二项式定理:
通过结合二项式定理和帕斯卡三角形,可以看出第n个三角形数为:
第 n 个四面体数为:
前 n 个四面体数之和为:
和...
现在解释一下。对于这个解释,我将只使用 6 个字母 af,并将它们替换为数字 1-6。程序相同,字母更多
如果长度为 1,则可能的序列为:
1
2
3
4
5
6
在这个答案就是价值
现在长度为 2:
12 13 14 15 16
23 24 25 26
34 35 36
45 46
56
为了解决这个问题,我们将其分为 3 个部分:
- 查找上面行中的元素总数
- 在这种情况下,第一行有 5 个元素,第二行有 4 个,第三行有 3 个,依此类推。我们要做的是找到一种方法来对序列的前 n 个元素 (5,4,3,2,1) 求和。为了做到这一点,我们减去三角数。(1+2+3+4+5)-(1+2+3) = (4+5)。类似地 (1+2+3+4+5)-(1+2) = 3+4+5。因此该值等于:
- 现在,我们已经考虑了高于目标的值,并且只关心它所在的列。要找到它,我们添加 x1-x2
- 最后,我们需要添加长度为 1 的序列的数量。这等于 6。因此,我们的公式是:
接下来我们将重复长度为 3 的序列:
123 124 125 126
134 135 136
145 146
156
234 235 236
245 246
256
345 346
356
456
我们再一次把这个问题分成几个步骤:
- 找出每个数组上方有多少元素。数组值是倒三角数 (10, 6, 3, 1)。这一次,我们减去四面体数,而不是减去三角形数:
- 请注意每个单独的数组如何具有长度为 2 的序列的形状。通过从 x1 和 x2 中减去 x3,我们将序列减少到 2 次。例如,我们将从第二个数组中减去 2
这个
234 235 236
245 246
256
变成
12 13 14
23 24
34
- 我们现在可以使用长度为 2 的公式,用 6-x3 代替 6,因为我们的序列现在有不同的最大值
- 最后,我们添加长度为 1 和长度为 2 的序列的总数。事实证明,有多少特定长度的序列是有规律的。答案是组合。有长度为 1 的序列,长度为 2 的序列,依此类推。
结合这些,我们的长度为 3 的总公式变为:
对于更高长度的序列,我们可以遵循这种减少模式
现在我们将纠正我们的公式来寻找模式:
长度1:y1
长度 2:
长度 3:
注意:我还使用了长度 4 来确保模式保持不变
通过一些数学运算、术语分组以及从 6 到 26 的变化,我们的公式变为:
为了进一步简化这一点,必须做更多的数学运算。
这个恒等式适用于所有 a 和 b。对于一个快速有趣的练习,证明它(不是很困难):
这个恒等式允许进一步对术语进行分组和否定,以达到我们过于简化的公式: