csp m2 咕咕东的奇妙序列 二分

2023-05-16

题意:

题目描述
咕咕东 正在上可怕的复变函数,但对于稳拿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 项数字是多少!但是她睡醒之后发现老师讲的东西已经听不懂了,因此她把这个任务交给了你。

输入格式
输入由多行组成。
第一行一个整数q表示有q组询问
接下来第i+1行表示第i个输入 ,表示询问第k项数字。

输出格式
输出包含q行
第i行输出对询问 的输出结果。

样例输入
5
1
3
20
38
56
样例输出
1
2
5
2
0

在这里插入图片描述


思路:

首先一定要注意审题,这道题是将序列中的数字将字符看待的即“10”不是一个个体,而是“1”和“0”,千万不能看错。

我们所需要进行的是找某项数字是什么,由于他可怕的数据范围,我们不能暴力求解,因此可以采用二分法。

我们采用二分法来判断是在哪一个组中,二分法中最初的时候左边的组L为1,右边的组R为 sqrt(2 * number) + 1 (1 + 2 + 3 + … + n = number 计算得出),然后看包括M = (L+R)/2组的前面整体序列的长度与我们要求的项数的关系,若是小于项数,则L = M +1,否则R = M。

如何得到1-k组序列总体长度,注意观察题目我们发现组与组之间长度有如下的关系:

/*
1组 to 9组 : 字符长度差值为1  level 0
10组 to 99组 : 字符长度差值为2 level 1
100组 to 999组 : 字符长度差值为3 level 2
......
*/

因此我们便可以通过计算确定是第几组,利用每一个level里的组的长度属于等差数列的性质。计算过程下述代码中有具体描述,总结来说就是首先确定在哪一个level中,然后确定是那个level中的第几个,与之前的算出来的数字相加即可得到最终的在第几组。

当我们算出在第几组之后我们便可以去求这项数字属于这组哪一个数字,即如112中的2属于第二组中的数字2。首先我们通过(项数 - 这一组之前的所有的序列的长度)则到这一项属于这一组中的第几个,随后我们同样采取上面的level思想 ,1到9 每个元素一个字符长度,10到99两个字符长度,这样算下去就可以知道这一项在哪一个层的第多少个,然后再取模level,若是结果为0,则正好是一个数的最后一个,我们将他输出;若不是则出现了他在某一个数的不是最后的位置,我们要特殊处理。


总结:

审题很重要!
数学很重要!
二分很重要!

对于这种数据范围很大的题目,找元素时可以利用二分的思想;
可以利用数学计算简化操作,如等差数列的计算方法;


代码:

#include<stdio.h>
#include<algorithm>
#include<string>
using namespace std;

long long getlength(long long number)
{
	long long ans = 0;
	while (number > 0)
	{
		ans++;
		number = number / 10;
	}
	return ans;
}

/*
1组 to 9组 : 字符长度差值为1  level 0
10组 to 99组 : 字符长度差值为2 level 1
100组 to 999组 : 字符长度差值为3 level 2
......
*/

long long getSum(long long group)//得到前group组数据的长度和
{
	if (group == 0)return 0;
	long long length = getlength(group);
	long long sum = 0;
	long long level = 0;  //上述level
	long long power = 1;  //权重
	long long before_end = 0; //上一层最后一个
	for (long long i = 1; i < length; i++)
	{
		long long part_length = (long long)9 * power; //每一level里的数的个数
		long long sum_first =before_end + level + 1;
		long long sum_end = before_end + part_length * (level + 1);
		before_end = sum_end;
		sum += (sum_first + sum_end) * part_length / 2;  //(首项+尾项)* 项数 / 2
		level++;
		power = power * 10;
	}

	long long thisLevel_length = group - power + 1;
	long long sum_first = before_end + level + 1;
	long long sum_end = before_end + thisLevel_length * (level + 1);
	before_end = sum_end;
	sum += (sum_first + sum_end) * thisLevel_length / 2;  //(首项+尾项)* 项数 / 2

	return sum;
}

long long getGroup(long long number)
{
	long long l = 1;
	long long r = sqrt(2 * number) + 1;

	while (l < r)
	{
		long long m = (l + r) / 2;
		if (getSum(m) < number)l = m + 1;//代表number一定不在前m层
		else
			r = m;
	}
	return l;
}


char getvalue(long long group, long long number)
{
	long long this_partLength = number - getSum(group - 1);
	//现在确认是这一组里面的哪个数
	long long power = 1;
	long long level = 1;
	long long last = this_partLength;
	long long num = 0;
	while (last > 9 * power * level)
	{
		last -= 9 * power * level;
		num += 9 * power;
		power = power * 10;
		level++;
	}

	long long lo = last % level;
	long long tem = last / level;
	if (lo != 0)
	{
		tem++;
		num = num + tem;//num是这个位置属于的数
		return to_string(num)[lo - 1];//这个数位置上的字符
	}
	else
	{
		num = num + tem;//num是这个位置属于的数
		return to_string(num)[level - 1];//这个数位置上的字符
	}
}



int main()
{
	int q;
	scanf("%d", &q);
	for (int i = 0; i < q; i++)
	{
		long long ques;
		scanf("%lld", &ques);

		long long group = getGroup(ques);//求得在第几组
		char ans = getvalue(group, ques); //求得结果
		printf("%c\n", ans);
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

csp m2 咕咕东的奇妙序列 二分 的相关文章

  • Debian 一些基础操作

    1 Debian 服务器基础命令 span class token comment 查看Debian服务器版本 span root 64 localhost span class token comment cat etc issue sp
  • CentOS 8.0 安装 PostgreSQL12

    CentOS 8 0 基于最小包安装 xff0c 此后需要安装PostgreSQL12 1 安装源 dnf install https download postgresql org pub repos yum reporpms EL 8
  • 树莓派4配置USB启动-解决wlan0不识别问题

    参考了文章https blog csdn net nanhantianyi article details 106542616 基于RaspiOS lite 2021 1 11 成功升级了Pi4的eeprom 制作并实现了USB 2 0硬盘
  • 解决Manjaro内核升级失败无法启动问题一例

    这两天升级了manjaro 5 10 13 内核过程中 xff0c 一台Asus N43的老本出现了各种诡异问题 xff0c 记录一下 xff1a 1 目录链接丢失 参照其他机器重建了lib sbin等目录链接 2 新内核无法启动 将gru
  • Sever2019安装OpenSSH问题1例

    从github下载的openssh for windows版本 xff0c 执行ps脚本安装 xff0c ssh登录正常 xff0c winscp反复报错 无法初始化SFTP协议 主机是SFTP服务器吗 xff1f 查阅了各种资料 xff0
  • Excel2013 打开文档 显示 内存或磁盘空间不足 无法再次打开或保存 的问题

    Office 2013 问题描述 xff1a 我在网上下载了一个 excel 2003 的文件 xff0c 双击打开 xff0c Excel 提示 xff1a 内存或磁盘空间不足 excel 无法再次打开或保存 解决方案 xff1a 右键下
  • Oracle安装问题INS-30131解决方法

    Win 8下安装Oracle 11 2 0 4遇到了错误INS 30131 Google搜索发现多说都说是共享文件夹问题 xff0c 按方法试验无效 于是想删除临时文件再重新安装一次 xff0c 发现oraremexecservice目录无
  • 去掉微信浏览器里的放大缩小按钮

    lt meta http equiv 61 34 Content Type 34 content 61 34 text html charset 61 utf 8 34 gt lt meta name 61 34 viewport 34 c
  • 清除SSH秘钥的命令

    重新安装了openmediavault之后在连接就是这样 xff0c 具体的原因是因为主机保存了以前的秘钥 PS C Users qs gt ssh root 64 10 11 12 2 64 64 64 64 64 64 64 64 64
  • HR-XML(可扩展人力资源标准)简介

    HR XML xff08 可扩展人力资源标准 xff09 简介 Flyspace flyspace 64 x263 net 2003 年 12 月 12 日 标准出处 xff1a http www hr xml org 标准简介 xff1a
  • 解决System进程占用80端口的问题

    1 IIS占用80端口 用如下方法可以解决System进程占用80端口的问题 xff1a 打开RegEdit 找到HKEY LOCAL MACHINE SYSTEM CurrentControlSet Services HTTP 找到一个D
  • Win 7, Server 2008 R2最大线程数限制

    最近在做压力测试时发现Win 7 和 Server 2008 R2 系统内线程数设为1500则无法创建线程池 xff0c 深入分析发现32位和64位程序存在很大性能差异 最大线程数 xff1a 32bit xff1a 1450 64bit
  • 算法|找出数组的最大公约数

    力扣第255场周赛题目 刷题链接 https leetcode cn com problems find greatest common divisor of array 题目描述 给你一个整数数组 nums xff0c 返回数组中最大数和
  • 结构体对齐规则

    结构体对齐规则 xff1a 1 第一个成员在于结构体变量偏移量为0的地址处 2 其他成员变量要对齐到某个数字 xff08 对齐数 xff09 的整数倍的地址处 对齐数 61 编译器默认的一个对齐数 与 该成员大小的 较小值 3 结构体总大小
  • Snapper转换器的捕捉类型

    原文发布时间 xff1a 2014 09 24 作者 xff1a Tenniwdy 在数据处理中Snapper转换器的作用是很强大的 xff0c 它的各类捕捉类型能针对不同的需求对数据进行处理 在FME Desktop 2014版本中新增了
  • STM32 4x4矩阵键盘初始化及实现多位输入

    目的 xff1a 实现矩阵键盘的多位数据输入 这里以两位数据为例 引脚初始化PC0 PC7 void Key Config GPIO InitTypeDef GPIO InitStructure RCC APB2PeriphClockCmd
  • CSP 202206 题解:归一化处理,寻宝大冒险,角色授权,光线追踪,PS无限版

    试题内容请前往CCF官网查看 xff1a CCF CSP计算机软件能力认证考试 http 118 190 20 162 home page 阅读本题解前 xff0c 您应当了解下列知识 xff1a 线段树 教程C 43 43 标准库 xff
  • 在 VirtualBox 中构建 Debian11 虚拟电脑

    文章目录 前言一 准备工作和Debian简介二 新建虚拟电脑三 安装 Debian11四 Debian11系统环境配置配置光盘软件镜像源配置国内镜像软件源控制台鼠标支持 安装虚拟机增强功能SSH 接入国际化和本地化配置网卡 结语 前言 介绍
  • 【华为机试真题 Python】 放苹果

    目录 题目描述 输入 输出 示例 参考代码 题目描述 把m个同样的苹果放在n个同样的盘子里 允许有的盘子空着不放 问共有多少种不同的分法 注意 如果有7个苹果和3个盘子 5 1 1 和 1 5 1 被视为是同一种分法 数据范围 0 m 10
  • keil5 显示 No target connected

    keil5 显示 No target connected 第一 xff0c 确认上电是否正常 xff0c 板子上有电源指示灯 xff1b 就是那个红色的指示灯 第二 xff1a 长按核心板上的复位键不要松开 找到Debug xff0c 确认

随机推荐

  • Debian系统安装中文包

    相对于Ubuntu系统 xff0c debian系统性对来说较为原始 xff0c 不能像Ubuntu一样一键设定为中文 xff0c 这样就必须自行设定 xff1a 1 安装aptitude xff1a sudo apt span class
  • 解决Linux(Ubuntu)系统下复制粘贴文件权限不够的问题

    首先是ctrl 43 alt 43 t 打开一个终端 运行命令 sudo nautilus 就可以打开一个具有管理员权限的文件管理器 xff0c 然后就可以在不切换到管理员的条件下拷贝文件
  • 解决开机出现“CLIENT MAC ADDR”的问题

    开机自检后 xff0c 系统会出现网卡配置的提示 xff0c 此时按Shift 43 F10组合键可进入配置页面 xff0c 如果不按该组合键 xff0c 几秒后则跳入下一页面 xff0c 这里会停留一段时间 xff0c 一般是一二十秒的样
  • iOS之性能优化·提高App的编译速度

    一 前言 经过多年的开发和迭代 xff0c 我相信很多的 iOS 项目代码已经达到几十万行甚至上百万行的规模 xff0c 所使用的 Pod 库的数量可以达到几十个甚至上百个 xff0c App Store 安装包也变得越来越大 xff0c
  • iOS之性能优化·优化App界面的渲染与流畅度

    一 界面渲染流程 渲染流程分析 计算机中的显示过程通常是通过 CPU GPU 显示器协同工作来将图片显示到屏幕上 xff0c 如下图所示 xff1a 苹果为了解决图片撕裂的问题使用了 VSync 43 双缓冲区的形式 xff0c 就是显示器
  • 图像处理:傅里叶变换

    0 引言 在之前的博客 图像增强 xff0c 傅里叶变换 xff08 OpenCV 中都有用到过傅里叶变换 xff0c 但一直都不是特别理解 xff0c 现系统地学习一下 先来看一个视频 傅里叶级数与傅立叶变换 xff0c 我们了解到任何周
  • 从键盘输入10个整数,判断并输出10个数中的最大值和平均值

    include lt graphics h gt include lt conio h gt include lt stdio h gt int main int a 61 0 b 61 0 c 61 0 i 61 1 n max 61 0
  • ubuntu虚拟机忘记开机密码,重置密码

    有时我们会忘记ubuntu虚拟机的开机密码 xff0c 这是候需要我们重置密码 xff0c 步骤如下 xff1a 1 打开虚拟机 xff0c 在虚拟机启动界面出现时 xff0c 鼠标点击虚拟机启动界面 xff0c 将键盘输入定向到虚拟机 x
  • 结构体数组操作+文件读写

    一 1 声明了该结构体就声明了结构体内所有成员 include lt stdio h gt typedef struct stuInfo char name int age int num Student int main int argc
  • CEF中JavaScript与C++交互

    在CEF里 xff0c JS和Native xff08 C C 43 43 xff09 代码可以很方便的交互 xff0c 这里https bitbucket org chromiumembedded cef wiki JavaScriptI
  • 阿里云网盘内测网址

    阿里云Teambition网盘内测申请地址 这个网盘还没有开放 xff0c 想要体验的话可以申请 xff0c 通过后 xff0c 获得体验资格 网址 xff1a https form teambition net f CjQetM x fi
  • Python 创建安装包

    Version usr bin env python3 coding utf 8 64 Author forward huan 64 Time 2022 07 14 23 05 64 Description import json impo
  • IOS UITableViewCell高度自适应的那些事

    好啦 xff0c 这是一个老生常谈的问题 真的 xff0c 有时候把人气得想去搞安卓 xff0c 安卓就没得这码子事 xff5e 方案有很多 xff0c 我这里提供三种方案 其实每种自适应高度的方法都有比较适合自己的情景 xff0c 比如c
  • Sublime Text 最新注册码

    Sublime Text 最新注册码 Sublime 更新后 xff0c 很多验证码都失效了 收集了一些在 2017 09 14 测试有效的注册码 xff0c 适用于 xff1a Sublime Text 2 3 xff0c Build 2
  • 群晖NAS变成TimeMachine时间机器完成Mac备份

    如果有一台群晖Nas xff0c 那么我们可以很方便的利用他完成Mac系统的自动备份 我的群晖在路由器后面 xff0c 所以当我不再家的时候备份 xff0c 则需要使用vpn连接到群晖 接下来让我们实践出真知吧 1 在群晖nas中设置一个同
  • 如何生成ssh key,以及repo init 遇到的无法检查签名:找不到公钥 问题

    repo init 遇到 无法检查签名 找不到公钥 的问题 源文章 xff1a http blog csdn net njuitjf article details 38386941 方法一 xff1a 出现此问题是repo版本不对的问题
  • 选数问题 Gym - 270437C

    题意 xff1a 给定n个正整数 xff0c 从中选取K个数 xff0c 保证这K个数的和是S 求有多少种选择的方法 Input 第一行输入一个整数T T lt 61 100 xff0c 表示有T个测试样例 对于每个例子 xff0c 有两行
  • 掌握魔法的东东II Gym - 101510B

    题意 xff1a 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 x
  • 传递闭包 Floyd算法

    题意 xff1a 众所周知 xff0c TT 有一只魔法猫 这一天 xff0c TT 正在专心致志地玩 猫和老鼠 游戏 xff0c 然而比赛还没开始 xff0c 聪明的魔法猫便告诉了 TT 比赛的最终结果 TT 非常诧异 xff0c 不仅诧
  • csp m2 咕咕东的奇妙序列 二分

    题意 xff1a 题目描述 咕咕东 正在上可怕的复变函数 xff0c 但对于稳拿A Plus的 咕咕东 来说 xff0c 她早已不再听课 xff0c 此时她在睡梦中 突然想到了一个奇怪的无限序列 xff1a 112123123412345