需要计算由数字组成并且能被和整除的n
-digit 数字的个数。4
7
4
7
n f(n) n f(n) 1 0 11 73 2 0 12 146 3 0 13 292 4 0 14 585 5 1 15 1170 6 2 16 2340 7 4 17 4681 8 9 18 9362 9 18 19 18724 10 36 20 37449
PS这个问题与从 n 位数字中快速搜索数字有关,例如 74444744444。但是那里的数字是打印出来的,这里只需要计算它们。
需要计算由数字组成并且能被和整除的n
-digit 数字的个数。4
7
4
7
n f(n) n f(n) 1 0 11 73 2 0 12 146 3 0 13 292 4 0 14 585 5 1 15 1170 6 2 16 2340 7 4 17 4681 8 9 18 9362 9 18 19 18724 10 36 20 37449
PS这个问题与从 n 位数字中快速搜索数字有关,例如 74444744444。但是那里的数字是打印出来的,这里只需要计算它们。
在 C++ 中:
据我了解,在 Python 中,
https://oeis.org/A033138
适用于 n 到一千(Python 中为 15 秒)的方法。
基于基于三元组的交替总和的 7 整除的符号(此处)。我们把数字分成3位数的面,把它们加起来,如果结果能被7整除,那么也是原来的数字。
对于初级三合会,只有两个选项,立即设置,我们整理第二个三合会。我们得到所有组合的可能数量的计数器,选择那些可以被 7 整除的数量。
我没有@Harry 猜想的那么漂亮的解决方案,但是
O(log n)
,其中n
是数字中的位数,首先,请注意所有数字必须看起来像
a = <b44>
,即以两个四位结尾。否则,a
它不能被 4 整除。让我们找到余数
a % 7
:(b*100 + 44) % 7 = (b*100)%7 + 44%7 = (b%7)*(100%7) + 2 = (b%7)*2 + 2
因此,当且仅当它以 44 结尾时,
a
它可以被 7 和 4 整除,并且通过丢弃最后两位数字获得的数字必须能被 7 整除,余数为 6。为什么是 6?因为a
b
a
6*2 +2 = 14 == 0 (mod 7)
要找出有多少这样的数字很长,
m = n-2
您需要稍微概括一下这个问题。m
让我们知道由长度为:的 4 和 7 组成的数字的残差直方图r_m = [ r0_m, r1_m, ..., r6_m]
,其中r0_m
是长度m
可被 7 整除且余数为 0 的数字数,r1_m
- 余数为 1 等。r_m
又是如何关联的r_{m+1}
?设
b
一些长度m
。让我们把右边的数字 4 和 7 添加到它上面。我们得到两个数字b1 = <b4>, b2 = <b7>
。它们除以 7 的余数是多少?b1 % 7 = ((10*b) + 4)%7 = (b%7)*(10%7) + 4 = 3*(b%7) + 4
b2 % 7 = ((10*b) + 7)%7 = (b%7)*(10%7) + 0 = 3*(b%7)
也就是说,每个余数
r
生成两个余数3r
和3r+4
。我们明确地写出来。左边是长度数的余数,m
右边是长度数的两个余数m+1
在矩阵形式中,它看起来像这样:
因为
m=0
只有一个数,0
。因此,初始残差向量r_0 = [1,0,0,0,0,0,0]
r_m = (A^m)@r_0
这是从到
A
的转移矩阵r_m
r_{m+1}
要回答原始问题,您需要计算
r_{n-2}
并从中获取第六个分量(从 0 开始编号),对应于n-2
除以 7 时余数为 6的长度数类型在构造函数
A
中明确指定,object
因此元素是任意长度的 Pythonic 整数。如果未指定类型,则它将numpy
优化整数并将其存储为 32 位整数。对于求幂,使用
numpy.linalg.matrix_power
,因为内置函数按元素求幂pow
。结果
由于求幂
m
使用具有复杂度的算法O(log m)
,所以 的复杂度n
等于O(log(n-2))
,即O(log n)
该算法也可用于其他条件。例如,对于由数字 5 和 9 组成的数字,它们可以被 5 和 9 整除。余数将有不同的矩阵和不同的条件,但解决方案将保持不变。
甚至可以不使用两个四人组进行优化。在这种情况下,矩阵是 28 x 28 。
结果是一样的。
@Harry 的解决方案
我不会承诺推导出确切的公式,但
2^(n-2)//7
它很容易证明是正确的。加减一)n
只有合适的长度数字2^(n-2)
,因为最后两位数字是固定的。除以 7 时的余数是均匀分布的,相差不超过 1。因此,具有固定余数的数字的数量——在我们的例子中,余数 6——是2^(n-2) / 7
正负 1。我不知道如何严格证明关于残差均匀分布的论文。从一般考虑,矩阵的结构说明了这一点
A
——每行正好有两个,行是混合的,所以矩阵A
应该很好地对齐残差的直方图,混合最大值和最小值。最令人惊讶的是,该公式不仅适用于大数,也适用于小数,其中波动加负1与函数的值相当相称
我会使用这个算法: