ABC363 DEF 题解
ABC363 DEF 题解
前情提要:赛时过了 ABCE。
D - Palindromic Number
其实赛时已经看出了一些性质,但没想完做法,赛后看题解才发现这么简单/fn
首先,为了方便,我们不把 视作回文数(因此需要特判一下 的情况)。
下面要证明: 位回文数有 个。这里,我们定义 位不含前导零回文数的数量为 ,则欲证的命题为 。
(这个数列在 OEIS 上面标号为 A050683)
证明这个结论的要点在于:如果一个数是回文数,它就可以由它的“前一半”数位确定。例如,如果已知一个 位回文数的前 位是 ,那么这个回文数就一定是 。所以 位回文数的个数,实际上就是“前一半”数位能产生的数的个数。下面以 为偶数来讨论。
如果 是偶数: 的前一半数位有 位,而 位的整数有 个,但这些整数有的包含了前导零。包含了前导零的整数的数量,可以看作确定第一位为 ,剩下 位产生的整数的数量。这个数量是 。综上所述, 位的不含前导零的整数的个数为 。
为奇数的情况依法类推。总之,如果把奇偶的表达式合并,就得到了欲证的式子:。
得到这个结论以后,我们枚举位数 ,不断从 减去 ,直到 ,这就说明欲求的回文数的位数是 ,并且它是第 个 位回文数(这里的 指的是已经减去了位数小于 的回文数个数的 ,下同)。
再次运用回文数的性质:回文数可以由它的前一半数位决定。对于 位回文数,它的前一半数位就是前 位。所以我们只要求出第 个不含前导零的 位数即可,这点不难实现。求出以后,把它翻转并拼接到自己的末尾,所得的就是欲求的回文数。
E - Sinking Land
依题意,可以得到一个地块沉没所需的两个条件:
- 该地块的海拔小于等于海平面。
- 该地块临海,或者与某个已沉没的地块相邻。(下面简单地把这个条件成为“临海”)
第一个条件中,海拔是一开始就确定的。而第二个条件中,一个地块什么时候临海,是动态的。并且一个地块只要在某个时刻开始临海,它在之后的时刻就会一直临海,直到沉没。
我们可以用优先队列维护地块的“临海”状态——把所有临海的地块都加入优先队列中。具体地,在优先队列中,我们按地块的海拔从小到大排序。每次海平面升高,就弹出队首的所有海拔不超过海平面的地块,同时计数以得到答案。如果某个地块沉没了,就把它的所有相邻地块都加入到优先队列中(如果这些地块还未被加入),表示这些地块也开始临海。
在这一过程中,需要记录每个地块是否被加入到队列中,以防重复统计。同时,由于每个地块只会被加入一次,所以时间复杂度为 (这里的 指题目中的 )。
F - Palindromic Expression
赛时没思路,赛后看了题解才知道搜索/fn(这么大的数除了搜索还能是什么??)
观察发现,如果一个数 能用回文表达式表达,有三种情况:
n
,如果 本身就是回文数。x*rev(x)
,其中rev(x)
表示x
的倒序书写。x*(expression)*rev(x)
,期中(expression)
也是一个回文表达式。
实际上,第二种情况可以不必讨论,因为可以把它看作 x*1*rev(x)
,这样就归到了第三种情况中。
于是我们可以设计出函数 ,它返回值为 的回文表达式。如果不存在这样的表达式,就返回空串。它的工作原理如下:
-
如果 是回文数,直接返回 。
-
否则,枚举 的因子 。如果 也是 的因子,那么 就有可能由
d*(expression)*rev(d)
表达,其中(expression)
是一个值为 的回文表达式。于是递归求解 即可。显然,在枚举因子 时,我们只需要尝试小于 的整数。原因如下:如果存在一个大于 的整数 ,使得 是 的因子,那么 一定小于 并且也是 的因子,而这样的数我们肯定已经枚举过了。通过这个限制,我们就可以大大降低时间复杂度。
需要注意的是,由于表达式中不能含有 ,所以要判断 中是否有 。
时间复杂度分析:还不会,但官方题解说上界是 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话