本题是区间动态规划问题。把数字a到数字b之间可以形成的可达数记作集合$s(a,b)$,则需要求$s(1,9)$。
$s(a,b)$可以用这样的方式计算:遍历$[a,b)$之中的每个整数c,从$s(a,c)$和$s(c+1,b)$中各取一个数$u,v$,并将$u+v,u-v,uv,u/v$添加到$s(a,b)$中。
对于除法需要注意v不能为0,不过这一条件事实上可以进一步优化为$v$既不能太小也不能太大,否则无法再通过乘除法得到整数,此处取的上下界是$10^{\pm5}$。
最终结果是$20101196798$。
注:为便于作浮点数除法,以下代码为Python 3。
import math
epsilon=0.00001
s=[[set([float("0123456789"[i:j+1])]) if j>=i else set() for j in range(10)] for i in range(10)]
for x in range(2,10):
for a in range(1,11-x):
b=a+x-1
for c in range(a,b):
for u in s[a][c]:
for v in s[c+1][b]:
s[a][b].add(u+v)
s[a][b].add(u-v)
s[a][b].add(u*v)
if epsilon<math.fabs(v)<100000:
s[a][b].add(u/v)
print(sum(set(round(x) for x in s[1][9] if math.fabs(x-round(x))< epsilon and round(x)>0)))
|