前言
今天又是一年一度的蓝桥(baoli)杯大赛,小 J 同学经过了两年的参赛,对于前三题秉承着能 baoli 就不要思考的出发点来做题,结果他今天在第三题填空题用暴力法踩坑了,比赛中卡了一小时居然还没做出来。睡了一觉下午清醒之后,用三分钟想到了一个简单的做法,写下了这篇博文。
题面
想不起完整的题目了,下面大概复述一下。
小明是个富二代,家里仓库非常大,里面常常装满了他网购来的各种好东西。有一天,他刚学完 C++,想算一算自己家仓库的长宽高(都是整数)最多可以有多少种组合,但他想了好久也没想出来,你能帮帮他吗?
比如仓库的体积为 4,那么就有 1×4×1,1×1×4,4×1×1,1×2×2,2×1×2,2×2×1 这六种放法,下面要求的是当体积为 2021041820210418 的情况下,共有几种放法。
心路历程
这个非常直白也没有什么难度的题为什么卡了我那么久? 大概还是因为自己一开始想的太过简单吧,因为太久没练算法题,当时一看到是个没有时间限制的填空题,就想着直接三重循环开干了。后来发现不太对,十六位数的三重循环算一天也未必算得完,后来断断续续又加了一些约束条件,比如:只用两个循环,最后一个数用除法来确定;第一层循环中的 $i$ 只遍历到 $\sqrt{N}$ ,第二层循环中的 $j$ 只遍历到 $\sqrt{N/i}$并且用 gcd 判断是否为互质的数,但,这些小伎俩在十六位数面前都是徒劳。十六位数面前只有使用 $O(\sqrt{N})$ 的算法才可以在短时间内得到解,当时在最后时间内明白了这一点后,再去想其他方法时间已经不太够了。
直到下午一觉睡醒,才突然醒悟,最常见的 $O(\sqrt{N})$ 算法不就是找因子数算法吗,大一就学过了,果然还是太久没有做题,并且在比赛的时候从一个错的方向进行思考,然后坑越踩越深,想回头也比较困难了。
虽然题解真的比较简单,但还是在下面写一下留个记录吧。
题解
1 |
|
总结
今年蓝桥杯的题整体难度上升了不少,填空题已经开始考图论题目了,稍微简单一点的填空题也没有以前好做了,甚至在大题第二题还涉及了比较少见的博弈论内容,总体来说题目可以说是更有区分度了吧。