CF1870F - Lazy Numbers 一道Trie树思路应用的题目

news2025/1/25 8:56:35

C F 1870 F − L a z y   N u m b e r s \mathrm{CF1870F - Lazy\ Numbers} CF1870FLazy Numbers

D e s c r i p t i o n Description Description

对于给定的 n n n k k k,求解出 1 ∼ n 1\sim n 1n 的每一个数在 k k k 进制下字典序排列的顺序,输出满足数字本身为当前排好序后的下标的条件的数的个数( E X : 1 \mathrm{EX:} 1 EX:1 1 1 1 位置是满足条件的)。


S o l u t i o n Solution Solution

对于这种 k k k 进制的题目,可以想到用 Trie 树进行存储并快速计算,不过该题的 Trie 树的建树方式为由高位往低位建图,且不用补前导 0 0 0。(如图所示,此时为 n = 9 , k = 2 n=9,k=2 n=9,k=2 时的建图情况)
image-20240212085557397

由于要以字典序排列,故采用每一个点下面的边也按由小到大排列。这张 Trie 树的图就记录 1 ∼ n 1\sim n 1n 中的每一个数,其中字典序的顺序其实就是 DFS 的顺序,即一个点在按字典序排序之后的下标即为在 DFS 序中的下标。因为每一个点对应的边都是从小到大排列的,所以左侧的点一定字典序小,越往右字典序更大。

之后可以发现在同一层中,相邻的点一定相差 1 1 1,但是 DFS 序一定相差大于 1 1 1,故在第 i i i 层中,相差为 0 0 0 的一定是某一连续的段,且差值是满足单调性的,故可以二分。

那么接下来的问题就是如何求出 DFS 序:不可能进行一次 DFS 做一遍,因为 n n n 是达到 1 0 18 10^{18} 1018 级别的,必定 TLE。但是,可以发现求某个数的 DFS 序可以转化为求有多少个数在他之前访问。

对于转化后的问题,就好求多了,对于每一层,计算出位于这个数左边的数的个数:

image-20240212085557397

对于蓝色的数字个数,就是 6 6 6 在每一层时所对应的数的左边的数(包含该数),例如 6 6 6 在第 2 2 2 层所对应的数为 3 3 3,也就是有根节点到 6 6 6 号点所组成的链中的第 2 2 2 层的点。这个可以考虑 6 6 6 k k k 进制的前缀来计算,比如说 k = 2 k=2 k=2,那么二进制是 110 110 110:第一个前缀为 1 1 1,十进制为 1 1 1,故第二层所对应的数为 1 1 1;第二个前缀为 11 11 11,十进制为 3 3 3,故第二层所对应的数为 3 3 3;第三个前缀为 110 110 110,十进制为 6 6 6,故第三层对应的数为 6 6 6

由于在 k k k 进制下第 i i i 层最左侧的数为 k i k^i ki,其中 i i i 0 0 0 开始,即 1 1 1 的那一层为第 0 0 0 层。那么这一层比他小的数为:前缀 i − k i + 1 i - k^i+1 iki+1。比如说,第 2 2 2 层( 6 6 6 的那一层),就应该是 6 − 2 2 + 1 = 3 6-2^2+1=3 622+1=3

这样,就可以快速的求解出蓝色部分的值了,但是还有绿色部分也比 6 6 6 的 DFS 序小,所以如果未到这棵树的最后 1 1 1 层,可以通过尾部不断加入 0 0 0 来继续计算(计算方式与上文一致),不过在最后一层要特别注意,可能是不满的,所以此时不能再用前缀减 k i k^i ki 了,而是用 n n n k i k^i ki 1 1 1。例如, 6 6 6 在末尾加 0 0 0 直到达到整棵树的深度: 1100 1100 1100,这时候在第 3 3 3 层时,不能直接用当前数减 8 8 8 1 1 1,而是用 9 9 9,因为 9 9 9 12 12 12 1100 1100 1100)之间的数是没有的。注意:这里 12 12 12 不能算入比 6 6 6 小的因为这是方便计算加入的 0 0 0 才出现的数,不能计入贡献。

最后拿 3 3 3 给大家展示一下全过程:

image-20240212085557397
  1. 蓝色部分:

    (1)第 0 0 0 层: 1 1 1(二进制 1 1 1 − 2 0 + 1 = 1 - 2^0+1=1 20+1=1

    (2)第 1 1 1 层: 3 3 3(二进制 11 11 11 − 2 1 + 1 = 2 -2^1+1=2 21+1=2

  2. 绿色部分:将 3 3 3 补完 0 0 0 后得到 1100 1100 1100,数字为 12 12 12

    (1)第 2 2 2 层: 6 6 6(二进制 110 110 110 − 2 2 + 1 − 1 = 2 -2^2+1-1=2 22+11=2(注意不能包含 6 6 6

    (2)第 3 3 3 层: 9 − 2 3 + 1 = 2 9-2^3+1=2 923+1=2(最后 1 1 1 层用 n n n 减)

最后将贡献相加: 1 + 2 + 2 + 2 = 7 1+2+2+2=7 1+2+2+2=7 3 3 3 的 DFS 序为 7 7 7 位置。

至此,该题目就可以在 O ( log ⁡ 2 n log ⁡ k 2 n ) O(\log_2n\log_k^2n) O(log2nlogk2n) 的时间复杂度通过该题目了,注意某些位置要开 __int128,不过尽量减少使用,详见代码。


C o d e Code Code

#include <bits/stdc++.h>
#define int long long

using namespace std;

typedef __int128 i128;

int N, K, L, Pow_K[100], KX[100], S1, S2;

int DFS(int X)
{
	int Result = 0; i128 DEC = 0; S1 = 0, S2 = 0;
	while (X) KX[S1 ++] = X % K, X /= K;
	reverse(KX, KX + S1);
	for (int i = 0; i < S1; i ++) DEC = DEC * K + KX[i], Result += DEC - Pow_K[i] + 1;
	for (int i = S1; i < L; i ++) DEC = DEC * K, Result += min(DEC - 1, (i128)N) - Pow_K[i] + 1;
	return Result;
}

void solve()
{
	cin >> N >> K;

	i128 T = 1; int M = 0, Cpy = N; L = 0, Pow_K[0] = 1;
	while (T * K <= (i128)N) T *= K, M ++, Pow_K[M] = T;
	while (Cpy) Cpy /= K, L ++;

	int Result = 0;
	for (int i = 0; i < L; i ++)
	{
		int l = Pow_K[i], r = Pow_K[i + 1] - 1, l2 = Pow_K[i], r2 = min(Pow_K[i + 1] - 1, N);
		if (i == L - 1) r = N, r2 = N;
		while (l < r) DFS(l + r >> 1) - (l + r >> 1) < 0 ? l = (l + r >> 1) + 1 : r = (l + r >> 1);
		while (l2 < r2) DFS((l2 + r2 + 1 >> 1)) - (l2 + r2 + 1 >> 1) > 0 ? r2 = (l2 + r2 + 1 >> 1) - 1 : l2 = (l2 + r2 + 1 >> 1);
		if (DFS(l) != l) continue;
		Result += r2 - l + 1;
	}

	cout << Result << '\n';
}

signed main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int Data;

	cin >> Data;

	while (Data --)
		solve();

	return 0;
}

F i n a l    W o r d s Final\ \ Words Final  Words

  1. 题目细节很多,还要注意减少 __int128 的使用,写代码的时候要耐心写
  2. 这道题目值得大家取仔细思考,比如说一开始我写了一个 O ( log ⁡ 2 n log ⁡ k 3 n ) O(\log_2n\log_k^3n) O(log2nlogk3n) 的复杂度,之后 TLE 了,才改成 log ⁡ k 2 n \log^2_k n logk2n 的。
image-20240212085557397

​ 一张坎坷 A C \bold{\color{green}{AC}} AC 历程给大家展示

  1. 这道题目主要考察了 Trie 树,却没有真正的需要写 Trie 树,而是通过二分与数学推导的结合来实现这到题目,可谓是及其的妙!
  2. 也是本蒟蒻做过不多的紫题中的一道,研究了 2 2 2 天,在此纪念一下~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1445422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab图像处理——图像边缘检测方法(算子)

1.edge函数语法 BW edge(I) BW edge(I,method) BW edge(I,method,threshold) BW edge(I,method,threshold,direction) BW edge(___,"nothinning") BW edge(I,method,threshold,sigma) BW edge(I,method,threshold,h) BW edge(I) 返回二值图像 BW&#xff0…

分享89个时间日期JS特效,总有一款适合您

分享89个时间日期JS特效&#xff0c;总有一款适合您 89个时间日期JS特效下载链接&#xff1a;https://pan.baidu.com/s/127_keimOfy_AKrCNT4TQNA?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

Java安全 CC链1分析(Lazymap类)

Java安全 CC链1分析 前言CC链分析CC链1核心LazyMap类AnnotationInvocationHandler类 完整exp&#xff1a; 前言 在看这篇文章前&#xff0c;可以看下我的上一篇文章&#xff0c;了解下cc链1的核心与环境配置 Java安全 CC链1分析 前面我们已经讲过了CC链1的核心ChainedTransf…

【开源】SpringBoot框架开发木马文件检测系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木马软件模块2.4 安全资讯模块2.5 脆弱点模块2.6 软件检测模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 木马分类表3.2.2 木马软件表3.2.3 资讯表3.2.4 脆弱点表3.2.5 软件检测表…

GEE数据集——巴西年度土地覆被和利用地图

巴西年度土地覆被和利用地图 巴西年度土地利用和土地覆被制图项目是一个由生物群落、土地利用、遥感、地理信息系统和计算机科学专家组成的合作网络&#xff0c;依靠谷歌地球引擎平台及其云处理和自动分类功能生成巴西年度土地利用和土地覆被时间序列。MapBiomas 项目--是一项多…

C++入门学习(二十七)跳转语句—break语句

1、与switch语句联合使用 C入门学习&#xff08;二十三&#xff09;选择结构-switch语句-CSDN博客 #include <iostream> #include <string> using namespace std;int main() { int number;cout<<"请为《斗萝大路》打星(1~5※)&#xff1a;" &…

python统计分析——两样本t检验

参考资料&#xff1a;用python动手学统计学 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 用于绘图的库 from matplotlib import pyplot as plt import seaborn as sns sns.set() 2、准备数…

导数的几何意义【高数笔记】

1. 高数中的导数几何意义&#xff0c;与中学中斜率的联系 2. 导函数与导数的区别和联系又是什么 3. 导数的几何意义的题型是什么 4. 这些题型又有哪些区别 5. 点在曲线外和点在曲线上&#xff0c;需要注意什么 6. 法线和切线有什么关系 7. 法线是什么

JavaScript DOM 变动观察器(Mutation observer)

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 DOM 变动观察 是 web 开发中的一个重要概念&#xff0c;指的是监视 …

动静态库原理

静态库.a lib文件夹&#xff0c;存放着所有的库。 我们想写了自己的部分功能实现和代码&#xff0c;很多个.0和.h 但是实现文件太多了&#xff0c;我们把它打包在一起就是静态库。 那么如何打包呢&#xff1f;ar命令 ar -rc libhello.a mython.o myprintf.0 r 代表打包 c创…

【JS逆向六】(下)逆向解密某网站返回的密文的值 仅供学习

逆向日期&#xff1a;2024.02.07 使用工具&#xff1a;Node.js 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;在线AES加解密工具 1、打开某某网站(请使用文章开头的…

人工智能三子棋-人机对弈-人人对弈,谁会是最终赢家?

✅作者简介&#xff1a;大家好我是原始豌豆&#xff0c;感谢支持。 &#x1f194;本文由 原始豌豆 原创 CSDN首发&#x1f412; 如需转载还请通知⚠ &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;C语言项目实践…

CTF--Web安全--SQL注入之Post-Union注入

一、手动POST注入实现绕过 账号密码检测 我们利用sqli-labs/Less-11靶场来进行演示&#xff1a; 我们可以看到一个登录页面 打开Less-11的根目录&#xff0c;我们打开页面的源代码(PHP实现)。 用VS-code打开文件&#xff0c;找到验证登录信息的代码行。 此形式的代码存在POST…

从零开始学howtoheap:fastbins的house_of_spirit攻击3

how2heap是由shellphish团队制作的堆利用教程&#xff0c;介绍了多种堆利用技术&#xff0c;后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;优化pwn虚拟机配置支持libc等指…

《Git 简易速速上手小册》第4章:Git 与团队合作(2024 最新版)

文章目录 4.1 协作流程简介4.1.1 基础知识讲解4.1.2 重点案例&#xff1a;为 Python Web 应用添加新功能4.1.3 拓展案例 1&#xff1a;使用 CI/CD 流程自动化测试4.1.4 拓展案例 2&#xff1a;处理 Pull Request 中的反馈 4.2 使用 Pull Requests4.2.1 基础知识讲解4.2.2 重点案…

【Linux系统 04】OpenEuler配置

目录 一、镜像文件下载 二、配置静态IP 三、启动SSH连接 四、免密登录 五、安装常用软件 一、镜像文件下载 官方下载地址&#xff1a;openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 选择一个版本&#xff0c;lopenEuler通常有两种版本&#xff1a; 创新版&…

VTK 三维场景的基本要素(相机) vtkCamera 相机的运动

相机的运动 当物体在处于静止位置时&#xff0c;相机可以在物体周围移动&#xff0c;摄取不同角度的图像 移动 移动分为相机的移动&#xff0c;和相机焦点的移动&#xff1b;移动改变了相机相对焦点的位置&#xff0c;离焦点更近或者更远&#xff1b;这样就会改变被渲染的物体…

ZigBee学习——在官方例程实现组网

✨Z-Stack版本&#xff1a;3.0.2 ✨IAR版本&#xff1a;10.10.1 ✨这篇博客是在善学坊BDB组网实验的基础上进行完善&#xff0c;并指出实现的过程中会出现的各种各样的问题&#xff01; 善学坊教程地址&#xff1a; ZigBee3.0 BDB组网实验 文章目录 一、基础工程选择二、可能遇…

耳机壳UV树脂制作耳机壳的工艺流程是什么?

使用耳机壳UV树脂制作耳机壳的工艺流程如下&#xff1a; 获取耳模&#xff1a;首先&#xff0c;需要获取用户的耳模。这通常是通过使用一种柔软的材料注入到用户的耳朵中&#xff0c;然后取出并用来制作耳机的内芯。选择UV树脂&#xff1a;接下来&#xff0c;需要选择合适的UV…

小游戏和GUI编程(6) | 基于 SFML 的井字棋

小游戏和GUI编程(6) | 基于 SFML 的井字棋 0. 简介 使用 SFML 实现井字棋(tic-tac-toe), 规划如下: 了解规则&#xff0c; 使用命令行实现(已经实现了)使用 SFML&#xff0c;提供极简的交互(预计 1 小时)制作 SVG 图像&#xff0c; 美化界面(预计 1 小时) 1. 基于命令行的实…