首页 > 其他分享 >ABC363 DEF 题解

ABC363 DEF 题解

时间:2024-07-22 12:07:25浏览次数:6  
标签:10 frac 地块 题解 rev ABC363 operatorname DEF 回文

ABC363 DEF 题解

前情提要:赛时过了 ABCE。

D - Palindromic Number

题目链接

其实赛时已经看出了一些性质,但没想完做法,赛后看题解才发现这么简单/fn

首先,为了方便,我们不把 \(0\) 视作回文数(因此需要特判一下 \(n = 1\) 的情况)。

下面要证明:\(d\) 位回文数有 \(10^{\left\lfloor \frac{d+1}{2} \right\rfloor} - 10^{{\left\lfloor \frac{d+1}{2} \right\rfloor} - 1}\) 个。这里,我们定义 \(d\) 位不含前导零回文数的数量为 \(\operatorname{palin}(d)\),则欲证的命题为 \(\operatorname{palin}(d) = 10^{\left\lfloor \frac{d+1}{2} \right\rfloor} - 10^{{\left\lfloor \frac{d+1}{2} \right\rfloor} - 1}\)。

(这个数列在 OEIS 上面标号为 A050683

证明这个结论的要点在于:如果一个数是回文数,它就可以由它的“前一半”数位确定。例如,如果已知一个 \(8\) 位回文数的前 \(4\) 位是 \(1827\),那么这个回文数就一定是 \(18277281\)。所以 \(d\) 位回文数的个数,实际上就是“前一半”数位能产生的数的个数。下面以 \(d\) 为偶数来讨论。

如果 \(d\) 是偶数:\(d\) 的前一半数位有 \(d / 2\) 位,而 \(d / 2\) 位的整数有 \(10^{\frac{d}{2}}\) 个,但这些整数有的包含了前导零。包含了前导零的整数的数量,可以看作确定第一位为 \(0\),剩下 \(d/2 - 1\) 位产生的整数的数量。这个数量是 \(10^{\frac{d}{2} - 1}\)。综上所述,\(d / 2\) 位的不含前导零的整数的个数为 \(10^{\frac{d}{2}} - 10^{\frac{d}{2} - 1}\)。

\(d\) 为奇数的情况依法类推。总之,如果把奇偶的表达式合并,就得到了欲证的式子:\(\operatorname{palin}(d) = 10^{\left\lfloor \frac{d+1}{2} \right\rfloor} - 10^{{\left\lfloor \frac{d+1}{2} \right\rfloor} - 1}\)。

得到这个结论以后,我们枚举位数 \(d\),不断从 \(n\) 减去 \(\operatorname{palin}(d)\),直到 \(n \le \operatorname{palin}(d)\),这就说明欲求的回文数的位数是 \(d\),并且它是第 \(n\) 个 \(d\) 位回文数(这里的 \(n\) 指的是已经减去了位数小于 \(d\) 的回文数个数的 \(n\),下同)。

再次运用回文数的性质:回文数可以由它的前一半数位决定。对于 \(d\) 位回文数,它的前一半数位就是前 \(\left\lfloor \frac{d+1}{2} \right\rfloor\) 位。所以我们只要求出第 \(n\) 个不含前导零的 \(\left\lfloor \frac{d+1}{2} \right\rfloor\) 位数即可,这点不难实现。求出以后,把它翻转并拼接到自己的末尾,所得的就是欲求的回文数。

参考代码

E - Sinking Land

题目链接

依题意,可以得到一个地块沉没所需的两个条件:

  1. 该地块的海拔小于等于海平面。
  2. 该地块临海,或者与某个已沉没的地块相邻。(下面简单地把这个条件成为“临海”)

第一个条件中,海拔是一开始就确定的。而第二个条件中,一个地块什么时候临海,是动态的。并且一个地块只要在某个时刻开始临海,它在之后的时刻就会一直临海,直到沉没。

我们可以用优先队列维护地块的“临海”状态——把所有临海的地块都加入优先队列中。具体地,在优先队列中,我们按地块的海拔从小到大排序。每次海平面升高,就弹出队首的所有海拔不超过海平面的地块,同时计数以得到答案。如果某个地块沉没了,就把它的所有相邻地块都加入到优先队列中(如果这些地块还未被加入),表示这些地块也开始临海。

在这一过程中,需要记录每个地块是否被加入到队列中,以防重复统计。同时,由于每个地块只会被加入一次,所以时间复杂度为 \(O(n^2 \log n^2)\)(这里的 \(n^2\) 指题目中的 \(H\times W\))。

参考代码

F - Palindromic Expression

题目链接

赛时没思路,赛后看了题解才知道搜索/fn(这么大的数除了搜索还能是什么??)

观察发现,如果一个数 \(n\) 能用回文表达式表达,有三种情况:

  1. n,如果 \(n\) 本身就是回文数。
  2. x*rev(x),其中 rev(x) 表示 x 的倒序书写。
  3. x*(expression)*rev(x),期中 (expression) 也是一个回文表达式。

实际上,第二种情况可以不必讨论,因为可以把它看作 x*1*rev(x),这样就归到了第三种情况中。

于是我们可以设计出函数 \(f(n)\),它返回值为 \(n\) 的回文表达式。如果不存在这样的表达式,就返回空串。它的工作原理如下:

  1. 如果 \(n\) 是回文数,直接返回 \(n\)。

  2. 否则,枚举 \(n\) 的因子 \(d\)。如果 \(\operatorname{rev}(d) \times d\) 也是 \(n\) 的因子,那么 \(n\) 就有可能由 d*(expression)*rev(d) 表达,其中 (expression) 是一个值为 \(n / (\operatorname{rev}(d) \times d)\) 的回文表达式。于是递归求解 \(f(n / (\operatorname{rev}(d) \times d))\) 即可。

    显然,在枚举因子 \(d\) 时,我们只需要尝试小于 \(\sqrt{n}\) 的整数。原因如下:如果存在一个大于 \(\sqrt{n}\) 的整数 \(d\),使得 \(d \times \operatorname{rev}(d)\) 是 \(n\) 的因子,那么 \(\operatorname{rev}(d)\) 一定小于 \(\sqrt{n}\) 并且也是 \(n\) 的因子,而这样的数我们肯定已经枚举过了。通过这个限制,我们就可以大大降低时间复杂度。

    需要注意的是,由于表达式中不能含有 \(0\),所以要判断 \(d\) 中是否有 \(0\)。

时间复杂度分析:还不会,但官方题解说上界是 \(O(\sigma^2(n))\)。

参考代码

标签:10,frac,地块,题解,rev,ABC363,operatorname,DEF,回文
From: https://www.cnblogs.com/dengstar/p/18315781

相关文章

  • 题解 P1115 最大子段和
    link容易想到朴素做法:for(intl=1;i<=n;++i){for(intr=1;j<=n;++j){intv=s[r]-s[l-1];ans=max(ans,v);}}但是显然\(\mathrm{\color{#052242}TLE}\)再回头看代码:想要v最大,只需要\(\large{S_{l-1}}\)最小即可......
  • Teamcenter AWC开发,代码报错Error: Cannot read properties of undefined (reading 'h
    1、调用setProperties接口报错awaitsoaSvc.post('Core-2010-09-DataManagement','setProperties',info)Error:Cannotreadpropertiesofundefined(reading'hasOwnProperty')atObject.createError(soaService.js:486:1)ateval......
  • 题解:P7482 不条理狂诗曲
    题解:P7482不条理狂诗曲本题解借鉴blossom_j大佬思路,但这位大佬的题解似乎没放正确代码。题意对于每一个\(a\)的子区间\(a_{l\dotsr}\),求选择若干个不连续的数的和的最大值,对答案取模\(10^{9}+7\)。思路主要算法:分治。计算跨过中点\(mid\)的区间的\(f\)之和。首......
  • rabbitmq发送消息localdatetime报错:Java 8 date/time type `java.time.LocalDateTime`
    两种解决方案:通过全局配置LocalDateTime的序列化/***json序列化增强解决Jackson序列化不了Java8日期*/@BeanpublicMessageConvertermessageConverter(){ObjectMapperom=newObjectMapper();om.setVisibility(PropertyAccessor.ALL,JsonAut......
  • Codeforces Round 952 (Div. 4)复盘
    第一次打比赛的总结Q1CreatingWords这道题其实主要考的就是对于输入语句的理解,最开始我想的是运用scanf,puts,一个语句一个语句的去读取,但是确实对各个输入语句的了解过于肤浅了,特别是哪个读不读空格之类的,其实也算是没有把题目看清楚,它的难度其实没有自己以为的那么难,因为是限......
  • Codeforces 2400+ flows 大杂烩
    CF903GYetAnotherMaxflowProblem2700关键点:最大流转最小割显然我们需要用其他方式维护最大流,考虑到最大流等于最小割,于是我们去求最小割。考虑这个图的特性不难发现左边和右边两列都至多割掉一条边,于是我们直接枚举割掉的位置,剩下的左边前缀和右边后缀所有相连的边都要割......
  • Codeforces Round 960 (Div. 2)
    xht真的好强好强,好厉害这场打得有点史,共四发罚时还是抽象了,如果没有xht就真的完了呜呜。不过也说明我是真的菜,还有把做法想出来之后验证不到位。A.SubmissionBait罚时了,15min才过/lh稍微想一下可以知道,对于最大数\(x\),若其出现次数为奇数,那么A是必胜的,反之则只能从更小......
  • [Codeforces Round 960 (Div. 2)]A-E
    CodeforcesRound960(Div.2)A-EA题意:公平博弈。给定一个数组n个数,每个数只能用一次。给一个\(mx\)。每次轮到自己操作的时候就选一个数组里的数,满足\(a[i]>=mx\),然后令\(mx=a[i]\).双方轮流做直到一方无法操作,则另一方取胜。Sol:赛时1min猜了个错解,只看最大值,只看最大值的出......
  • Codeforces Round 958 (Div. 2)
    Preface周末补题计划的最后一场,这场由于是最古早的所以有些题题意都记不太清了赛时经典发病,前四题一题WA一发,然后把时间打没了E题经典没写完(中间还抽空写了个假做法),邮电部诗人了属于是A.SplittheMultiset刚开始还感觉无从下手,写了个记搜交上去还WA了,后面发现每次分......
  • Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)
    Preface这场比赛的时候CF一直抽风,快10min的时候才登上去,然后中间交题也一直在人机验证50min左右过了前5题后,F没想到生成树当场趋势了,赛后发现原来是原题大战可海星A.DiverseGame将每个数循环移位变为下一个数即可,注意特判\(n=m=1\)的情形#include<cstdio>#incl......