这道题印象特别深,因此专门写一篇博客。 刚考完那会很多人都在讨论这道题,个人分析的原因是表面看起来简单,但是深究起来还是有点难度的。
题目讲解
讲的是一个数字能够被分解为三个数相乘 一共有多少种方案。 例如:4 能够被分解为 1×1×4 1×4×1 4×1×1 1×2×2 2×1×2 2×2×1 有六种方案 请说出 2021041820210418 可以被分解为多少种方案
初级理解
最简单的遍历
for i in range(1,2021041820210419):
for j in range(1,2021041820210419):
for k in range(1,2021041820210419):
if i*j*k==2021041820210418:
sum+=1
这是最简单的遍历 进行枚举的方式进行处理 但是这可是16位数的数字 16位数的三次方 那是多么庞大的数字,怕是跑几天都跑不出来,更何况是比赛的4个小时 因此很多人都是被这个障眼法给迷惑住了
题目重新分解
首先观察 4 它的相乘方案 只有三个因子 就是1 2 4
我们不妨将这个数放大一下
观察100 100所有的相乘方案总和起来观察 就是1 2 4 5 10 20 25 50 100 进行组合相乘 可以看到 是以10为中心点 左右两边的数进行相乘 组成新的乘法方案
返回去观察4也是如此 那么我们可以利用这个原理 对2021041820210418这个数字进行分解
2021041820210418**(1/2)
以44955998作为中心点 进行因子的计算
for i in range(1,44955998):
if(2021041820210418%i==0):
li.append(i)
得出小于中心点的数字
for l in li:
m=int(2021041820210418/l)
lis.append(m)
得出大于中心点的数字
将因子整合
最后利用枚举进行方案的计算
for i in list:
for j in list:
for k in list:
if(i*j*k==2021041820210418):
sum+=1
总结
为什么会写这个 除了很多人讨论 更多的是自己在考场写错了 而且是快解出来了 写这篇博客还是为了提醒自己别在关键时刻犯病 不然只能事后诸葛亮了 记录于2021年4月18日