文章目录

  • 题意
    • Input
    • Output
    • 输入样例
    • 输出样例
    • 提示
  • 分析
  • 总结
  • 代码

题意

咕咕东 正在上可怕的复变函数,但对于稳拿A Plus的 咕咕东 来说,她早已不再听课,此时她在睡梦中
突然想到了一个奇怪的无限序列:112123123412345 …这个序列由连续正整数组成的若干部分构成,其
中第一部分包含1至1之间的所有数字,第二部分包含1至2之间的所有数字,第三部分包含1至3之间的所
有数字,第i部分总是包含1至i之间的所有数字。所以,这个序列的前56项会是11212312341234512345612345671234567812345678912345678910,其中第1项是1,第3项是2,第20项是
5,第38项是2,第56项是0。咕咕东 现在想知道第 k 项数字是多少!但是她睡醒之后发现老师讲的东西
已经听不懂了,因此她把这个任务交给了你。

Input

Output

输入样例

5
1
3
20
38
56

输出样例

1
2
5
2
0

提示



分析

这道题也不算很难,但是需要找到规律,这个过程可能会消耗一定时间,而且用代码实现规律的过程也不是很容易。现在还不太能做到在规定时间内做完第三题。


  • 序列的特征
  1. 初步分析

根据题意可知:

不考虑题目要求,仅观察这个序列,它的初步特征非常明显,就是将所有递增的小序列合并为一个大序列。

(1)(1 2)(1 2 3)…

其中,
第一个小序列为:1
第二个小序列为:1 2
第三个小序列为:1 2 3
而这三个序列在整个大序列中出现的次序分别为第1个、第2个、第3个。

由此推演不难发现:每个小序列都是从1开始,公差为1,项数等于小序列在大序列中出现的次序。而每个小序列中的数字个数同样也是等差的。

所以初步分析可得:题目所给序列满足每个小序列中的数为等差序列、每个小序列中的数字个数之间也为等差序列。

  1. 进一步分析小序列

但是,题目提到,在这个序列中每一项的序号并不是以数为单位,而是以单个数字为单位。

也就是说当出现多位数时,不是以一个数为单位,而是以一个单独的数字(0~9)为单位,所以这个数实际看作为它所包含的数字个数个。

例如,54 在这个序列中不算作出现的一项,而是以5和4视作出现了两项。

因此在这种方式下,我们自然要计算一下如何根据初步总结的数列特征来统计序列中实际包含的数字项数:

假设其中一个小序列,包含了1~无限大。显然无限大包含了从位数为1到无限大的数。
将相同位数的数放在同一个区间,我们可以发现:

1~9   共包含 9 * 1 项数字
10~99    共包含 90 * 2 项数字
100~999 共包含 900 * 3 项数字
...

综上可以得到规律:

一个递增序列中,位数为a的区间里共包含 9 * 10^(a-1) * a 项数字

因此,前a位数区间里包含的数字项数就等于从位数1项数累加到位数为a 的区间。

  1. 进一步分析大序列

通过分析小序列中的位数区间,自然也会联想到大序列中的位数区间。

大序列的位数区间指的是在该区间内所有小序列的项数都为同样的位数,也可以理解为该区间内所有小序列中的最大数都为同样位数。

那么我们又该如何计算大序列中各区间的数字项数呢?

最开始会觉得这很麻烦,因为我们很难估计那么多小序列组成的区间。但是通过1、2点分析,可以发现这其中不无规律:

  • 小序列之间的联系

每个小序列中都会比前一个序列多一个数,且多出来的这个数——即当前小序列中的最大数——都比其前一个小序列的大1。那么在最开始就会自然想到每一个小序列的数字项数也比前一个小序列大1。

但实际上并不是,仔细一想会发现,这要取决于当前小序列比前一个序列多出来的这个数的位数。

考虑序列中的一段:...(1 2 3 4 5 6 7 8 9)(1 2 3 4 5 6 7 8 9 10)...
第一个序列包含 9 项数字
第二个序列包含 11项数字...(1 2 3 4 5 6 7 8 9 10)(1 2 3 4 5 6 7 8 9 10 11)...
第一个序列包含 11 项数字
第二个序列包含 13 项数字...(1 2...98 99)(1 2 ... 99 100)...
第一个序列包含 9 + 90 * 2 = 189 项数字
第二个序列包含189 + 3 = 192项数字...

从上述例子中能感受到,当小序列中最大数的位数发生变化时,小序列包含数字项数所构成的等差序列的公差也会发生改变:

大序列的1位数区间(即区间中所有小序列的最大数都为1位数)
每个小序列所含数字项数构成的序列:
1 2 3 4 ...     公差为1大序列的2位数区间(即区间中所有小序列的最大数都为2位数)
每个小序列所含数字项数构成的序列:
11 13 15 17 ...     公差为2大序列的3位数区间(即区间中所有小序列的最大数都为3位数)
每个小序列所含数字项数构成的序列:
192 195 198 201 ...     公差为3...

显然每个位数区间都是从最大数为当前位数的最小数的小序列所包含的数字项数开始的,即为等差数列的首项。

大序列的1位数区间
第一个小序列为:1
数字项数 = 1大序列的2位数区间
第一个小序列为:1 2 3 4 5 6 7 8 9 10
数字项数 = 9 + 2 = 11大序列的3位数区间
第一个小序列为:1 2 ....98 99 100
数字项数 = 9 + 90 * 2 + 3 = 192...

即,位数为a区间的首项等于小序列中前a-1个位数区间的数字项数和+a。

综上,可得规律:

大序列中位数为a的区间中,所有小序列所包含的数字项数构成公差为a的等差数列。每个大序列位数a区间中的等差序列的首项等于小序列中前a-1个位数区间的数字项数和 + a。


  • 解题设计

将序列特征分析结束后,解题思路大致也可以想到。

如果我们能找到给定的项数包含在哪一个数内部,就很容易确定是这个数中的哪一个数字了。

但是大序列中有许多重复出现的数,所以我们得找到这个数具体是在哪一个小序列中。而每一个小序列中的一部分总会重复出现,所以又要进一步确定这个小序列到底是在大序列中的哪一段。

因此,根据反向思维整理可得:

已知目标数字x在大序列中的项数为m:

  • 确定x在大序列中的哪一个位数区间
  • 确定x在大序列位数区间中的哪一个小序列中
  • 确定x在小序列的哪一个位数区间中
  • 确定x在哪一个数中
  • 确定x在数的哪一位

根据以上步骤,从上至下逐步锁定m指向的数字x的位置。

1. 确定x在大序列中位数为a的区间

显然,项数为m的数字x被包含在大序列中第一个项数总数大于m的位数区间内。

为了优化搜索时间,我们可以用一个数组记录大序列中每一个位数区间的数字项数总数,方便比较。

2. 确定x在大序列位数a区间中的b小序列中

当确定了x在大序列中位数为a区间后,我们也就知道了这个区间中开头到任意一个小序列末尾包含的数字项数。

根据等差公式可以快速计算出最大项为n的小序列到区间起始所包含的数字项数总和。

n = 小序列最大项
a1 = 最大序列位数a区间第一个小序列的数字项数
d = 位数a

但项数m是指的x在整个大序列中的位置,此处我们需要知道x在这个位数区间中的位置。用m减去位数a区间之前的所有项数即可得到。

因此,
x在位数a区间中的项数m2 = m - 前a-1位数区间项数和

同样,第一个项数大于m2的小序列包含数字x,该小序列的最大项为b。

3. 确定x在小序列的位数c区间中

同理,用m2减去位数a区间内小序列b之前的项数得到数字x在这个小序列中的项数m3。

因此,
x在小序列中的项数m3 = m2 - 位数a区间内小序列b前的项数和

再根据小序列的各位数区间项数和来判定其属于小序列中的哪一个位数区间。

因为在实现过程中会多次用到小序列各位数区间的项数,为了减少计算时间,我用了一个数组存储小序列中所有位数区间的项数和。

同上,得到包含x的最小位数区间c。

4. 确定x来自于数y中以及其位数

当知道了x属于小序列中的位数c区间后,由于小序列是以1递增的整数序列,所以只要知道x在这个位数c区间内的位置,就能知道其所在数。

同理,
x在小序列位数区间c中项数m4 = m3 - 小序列前c-1位数区间项数和

此时范围已经缩减很小,只要稍作举例就能发现特征。

2位数区间:10 11 12 13..
1)每个2位数的个位的项数都可以整除位数2
如10的0为第2位、11的1为第4位、12的2为第6位...
2)十位数的项数除以位数2的余数都为13位数区间:100 101 102 103..
1)每个3位数的个位的项数都可以整除位数3
2)十位数的项数除以位数3的余数都为2
3)百位数的项数除以位数3的余数都为1...

根据举例证明,可以发现:

  • 当项数整除位数得到商k时,说明x为位数c区间中的第k个数y,且是y的个位。
  • 若无法整除,说明x为位数c区间中的第k+1个数y,且是y的个位,且在y中,x之前有(余数-位数)位数。

不过由于是从第1个开始算起,数y= 位数c的最小数+ 序号 - 1。


  • 优化&问题

  • 优化

当一出现在有序序列中进行查询时,就应该自然想到二分查找。因此在寻找大序列的位数区间,以及大序列位数区间中的小序列时,我都运用了二分。
二分法

[csp模拟2]T4——咕咕东的奇妙序列相关推荐

  1. csp模拟测试_1 T1咕咕东的奇遇和T2咕咕东想吃饭

    T1咕咕东的奇遇 问题描述 咕咕东是个贪玩的孩子,有一天,他从上古遗迹中得到了一个神奇的圆环.这个圆环由字母表组成首尾相接的环,环上有一个指针,最初指向字母a.咕咕东每次可以顺时针或者逆时针旋转一格. ...

  2. CSP3--T4咕咕东学英语

    题意: 咕咕东很聪明,但他最近不幸被来自宇宙的宇宙射线击中,遭到了降智打击,他的英语水平被归零了!这一切的始作俑者宇宙狗却毫不知情! 此时咕咕东碰到了一个好心人--TT,TT在吸猫之余教咕咕东学英语. ...

  3. 【Week9 作业】A - 咕咕东的目录管理器、B - 东东学打牌、C - 签到题,独立思考哈

    A - 咕咕东的目录管理器 题意: 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 -- 这工程量太大了,所以他定了一个小目标, ...

  4. 程序设计思维与实践 Week9 作业 A 咕咕东的目录管理器

    题目描述: 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 -- 这工程量太大了,所以他定了一个小目标,从实现一个目录管理器开始 ...

  5. 计算机研究生期间学英语,2022考研计算机程序设计:咕咕东学英语

    1.题目描述 咕咕东很聪明,但他最近不幸被来自宇宙的宇宙射线击中,遭到了降智打击,他的英语水平被归 零了!这一切的始作俑者宇宙狗却毫不知情! 此时咕咕东碰到了一个好心人--TT,TT在吸猫之余教咕咕东 ...

  6. CSP补题—A—咕咕东的奇遇—B—咕咕东想吃饭

    一.A-咕咕东的奇遇 题目描述: 咕咕东是个贪玩的孩子,有一天,他从上古遗迹中得到了一个神奇的圆环.这个圆环由字母表组成首尾相接的环,环上有一个指针,最初指向字母a.咕咕东每次可以顺时针或者逆时针旋转 ...

  7. 2019.8.10 NOIP模拟测试16 反思总结【基本更新完毕忽视咕咕咕】

    一如既往先放代码,我还没开始改- 改完T1滚过来了,先把T1T2的题解写了[颓博客啊] 今天下午就要走了,没想到还有送行的饯别礼,真是欣喜万分[并没有] 早上刚码完前面的总结,带着不怎么有希望的心情开 ...

  8. week4——实验题解(csp模拟1)

    题目1: 咕咕东的奇遇 咕咕东是个贪玩的孩子,有一天,他从上古遗迹中得到了一个神奇的圆环.这个圆环由字母表组成首尾相接的环,环上有一个指针,最初指向字母a.咕咕东每次可以顺时针或者逆时针旋转一格.例如 ...

  9. [比赛|考试] 咕咕掉的一些比赛总结

    咕咕掉1:9月9日上午nowcoder tg组1 咕咕掉2:9月14日晚上wannafly (以上是没有写总结的比赛,考得都很惨,更新不更新看心情,如果有更新会在本文里更新的) 9.12 下午校内 1 ...

最新文章

  1. solaris与linux区别,solaris与linux命令的区别
  2. php sqlserver扩展,PHP---连接sqlserver扩展配置
  3. python空值赋0_Python中的空值判断
  4. 前端常用linux命令
  5. android 生命周期_Android生命周期组件 Lifecycle 源码详解(一)
  6. A tutorial video for MindManager for free
  7. 碧蓝航线8.20服务器维护,碧蓝航线半人马来袭 8.20更新公告
  8. GitHub遭遇史上最强DDoS攻击:峰值流量1.35Tbps!
  9. 用UITextView加载rtfd文件
  10. Ubuntu 关闭触摸板
  11. 文件解压和压缩io流
  12. CSDN 赚积分C币方法
  13. Java基础——时间和日期
  14. 【数据结构:树】——搜索二叉树-K模型(非递归和递归)
  15. 新浪微博分享链接+图片
  16. html5 上标,HTML5 Canvas +下标和上标
  17. 平面与空间射影几何小结——平面射影几何
  18. 最好用的 20 款数据可视化工具
  19. MeanTeacher文章解读+算法流程+核心代码详解
  20. Markdown语法学习笔记

热门文章

  1. springboot整合mybatis问题:ORA-00918: 未明确定义列
  2. 实习第五天,说说心得体会
  3. oracle domnode释放,html DOM对象之方法cloneNode()的简介说明
  4. 健康饮食推荐系统设计
  5. 股票量价关系基础知识1
  6. 【算法】神经网络和深度学习简介
  7. 绑定MAC地址-防止ARP攻击
  8. StackOverFlowError原因和解决办法
  9. python 数字转十六进制_405. 数字转换为十六进制数(Python)
  10. 化工行业SRM供应商管理系统