1081. 度的数量(@数位dp)

news2024/9/27 19:26:34

活动 - AcWing

求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和。

例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意:

17=24+20
18=24+21
20=24+22

输入格式

第一行包含两个整数 X 和 Y,接下来两行包含整数 K 和 B。

输出格式

只包含一个整数,表示满足条件的数的个数。

数据范围

1≤X≤Y≤2^31−1
1≤K≤20
2≤B≤10

输入样例:
15 20
2
2
输出样例:
3

解析: 

数位DP基本概念

数位:把一个数字按照个、十、百、千等等一位一位地拆开,关注它每一位上的数字。

如果拆的是 十进制数,那么每一位数字都是 0 ~ 9,其他进制可 类比 十进制。

数位 DP:用来解决一类特定问题,这种问题比较好辨认,一般具有这几个特征:

        要求统计满足一定条件的数的数量(即,最终目的为计数)

        这些条件经过转化后可以使用「数位」的思想去理解和判断

        输入会提供一个数字区间(有时也只提供上界)来作为统计的限制

        上界很大(比如 10^9),暴力枚举验证会超时

从题目中分析出 数位DP 的模型后,做法就非常的 套路化 了

题目要求 一段区间 内符合某些条件的数的个数,我们用 前缀和思想 转换为求两个 前缀区间 的问题

res[l,r]=res[1,r]−res[1,l−1]

接下来的问题就是统计答案。

统计答案可以选择 记忆化搜索,也可以选择 循环迭代递推。

为了不重不漏地统计所有不超过上限的答案,要 从高到低 枚举每一位

再考虑每一位都可以 填哪些数字,最后利用上述 前缀和思想 统计答案

记忆化搜索 中要引入的参数通常有:

1.当前枚举到的数位 pos(搜索的深度)
2.前一位数(或是前几位数)的情况 st(诸如 前一位是什么、前几位总和是多少、某个数出现了几次 等)
3.前几位的数字是否等于上界的前几位数字 op (0/1)限制本次搜索的数位范围)
4.是否有前导零 lead (0/1)
记忆化搜索的 递归搜索树 y总已经画过了,这里就不再额外绘制(本身也不复杂,就留给读者了)

循环迭代递推 的方法,大家可以看 y总 的 算法提高课 以及 lyd 的 蓝书 上的介绍

何时能用 记忆化搜索 优化掉当前搜索分支
当前 数位 能够枚举集合内所有元素的时候(没有贴着上界),即 !op

---------------------------------------------------------------------------------------------------------------------------------

作者:一只野生彩色铅笔
链接:https://www.acwing.com/solution/content/66855/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#include<unordered_set>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
const int INF = 0x3f3f3f3f, mod = 1e9;
const double eps = 1e-8;
const int N = 35, M = N * 2;
int X, Y;
int K, B;
int c[N][N];

void init() {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j <= i; j++) {
			if (!j)c[i][j] = 1;
			else c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
		}
	}
}

int dp(int n) {
	if (!n)return 0;
	vector<int>nums;
	while (n)nums.push_back(n % B), n /= B;
	int ret = 0;
	int last = 0;
	for (int i = nums.size() - 1; i >= 0; i--) {
		int x = nums[i];
		if (x) {
			ret += c[i][K - last];
			if (x > 1) {
				if (K - last - 1 >= 0)ret += c[i][K - last - 1];
				break;
			}
			else {
				last++;
				if (last > K)break;
			}
		}
		if (!i && last == K)ret++;
	}
	return ret;
}

int main() {
	init();
	cin >> X >> Y;
	cin >> K >> B;
	cout << dp(Y) - dp(X - 1) << endl;
	return 0;
}

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

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

相关文章

恶意软件逆向工程:Ghidra 入门 -第三部分-分析 WannaCry 勒索软件

逆向工程是最受欢迎和最有价值的网络安全/信息安全技能之一。但很少有人能将自己的技能水平发展到精通这一备受追捧的技能。Ghidra 是美国间谍机构 NSA 提供的一种相对较新且免费的逆向工程工具。 在本教程中&#xff0c;我们将研究历史上最臭名昭著的一个恶意勒索病毒&#x…

使用docker部署数据可视化平台Metabase

目前公司没有人力开发数据可视化看板&#xff0c;因此考虑自己搭建开源可视化平台MetaBase。在此记录下部署过程~ 一、镜像下载 docker pull metabase/metabase:latest 运行结果如下&#xff1a; 二、创建容器 docker run -dit --name matebase -p 3000:3000\ -v /home/loc…

vulfocus靶场名称: apache-cve_2021_41773/apache-cve_2021_42013

Apache HTTP Server 2.4.49、2.4.50版本对路径规范化所做的更改中存在一个路径穿越漏洞&#xff0c;攻击者可利用该漏洞读取到Web目录外的其他文件&#xff0c;如系统配置文件、网站源码等&#xff0c;甚至在特定情况下&#xff0c;攻击者可构造恶意请求执行命令&#xff0c;控…

程序员缓解工作压力的小窍门

目录 1.概述 2.工作与休息的平衡 3.心理健康与自我关怀 4.社交与网络建设 1.概述 作为程序员&#xff0c;缓解工作压力是非常重要的。压力太大有可能会写很多bug。我们可以采取以下方法来保持高效和创新&#xff0c;同时维护个人健康和工作热情。 定时休息&#xff1a;保持…

手写Promise实现

手写Promise实现 一、前言二、代码三、测试四、测试结果 一、前言 阅读参考资料&#xff0c;本文整理出使用 构造函数 手撕出 Promise 的方法&#xff0c;在整理过程中不断添加注解以示思路。有错请指出哟&#xff0c;一起进步&#xff01;&#xff01;&#xff01;class 实现 …

【做一名健康的CSDNer】程序员哪几种行为最伤肾(程序员必看)

虽然没有专门针对程序员这一职业群体特有的伤肾行为的研究报道&#xff0c;但根据一般人群的健康风险和生活习惯&#xff0c;程序员由于其特殊的工作模式和环境&#xff0c;可能更容易出现如下伤肾的行为&#xff1a; 熬夜加班&#xff1a; 程序员由于项目进度、bug修复等原因&…

1、opencv介绍与开发环境搭建

1、opencv介绍 OpenCV 是 Intel 开源计算机视觉库&#xff0c;是一个跨平台的开源计算机视觉和机器学习软件库。它由一系列 C 函数和少量 C 类构成&#xff0c;可用于开发实时的图像处理、计算机视觉以及模式识别程序。 该库有 2500 多种优化算法&#xff0c;其中包括一套全面…

HarmonyOS ArkUI实战开发-NAPI 加载原理(上)

笔者在前 6 小结讲述了NAPI 的基本使用&#xff0c;包括同步和异步实现&#xff0c;本节笔者从源码的角度简单讲解一下NAPI 的加载流程&#xff0c;源码版本为 ArkUI 4.0 Release 版本。 hap 工程结构 工程配置签名后打一个 hap 包出来&#xff0c;然后解压该 hap 文件&#…

重发布及路由策略实验

目录 一、实验拓扑 二、实验需求 1、按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 上使用 loopback 口模拟业务网段 2、R2&#xff0c;R3 和R4运行 oSPF&#xff0c;各自协议内部互通 3、在 RIP 和 oSPF 间配置双向路由引入&#xff0c;要求除 R4 上的…

C++初阶学习第二弹——C++入门(下)

C入门&#xff08;上&#xff09;&#xff1a;C初阶学习第一弹——C入门&#xff08;上&#xff09;-CSDN博客 目录 一、引用 1.1 引用的实质 1.2 引用的用法 二、函数重载 三、内敛函数 四、auto关键字 五、总结 前言&#xff1a; 在上面一章我们已经讲解了C的一些基本…

【C语言】strstr函数刨析-----字符串查找

目录 一、strstr 函数介绍 ✨函数头文件&#xff1a; ✨函数原型&#xff1a; ✨函数解读 ✨功能演示 二、函数的原理以及模拟实现 ✨函数原理 ✨函数的模拟实现 三、strstr函数的注意事项 四、共勉 一、strstr 函数介绍 strstr函数是在一个字符串中查找另一个字符…

Leetcode 86. 分隔链表

题目链接&#xff1a; 86. 分隔链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/partition-list/description/ 题目&#xff1a; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出…

CDN技术:全球化的数字内容快速分发系统

CDN技术&#xff1a;全球化的数字内容快速分发系统 在今天的互联网世界中&#xff0c;内容分发网络&#xff08;CDN&#xff09;技术起着至关重要的作用。它通过全球分布的服务器网络&#xff0c;快速、安全地将内容送达世界各地的用户&#xff0c;极大地提升了网页加载速度和…

SpringBoot+vue开发记录(二)

说明&#xff1a;本篇文章的主要内容为SpringBoot开发中后端的创建 项目创建: 1. 新建项目&#xff1a; 如下&#xff0c;这样简单创建就行了&#xff0c;JDK什么的就先17&#xff0c;当然1.8也是可以的&#xff0c;后面可以改。 这样就创建好了&#xff1a; 2. pom.xml…

【Android12】Bugreport实现原理

Bugreport实现原理 Bugreport Bugreport介绍 Android Bugreport是一个用于记录和收集 Android设备上系统信息、日志和调试信息的工具。 系统发生某些问题时&#xff0c;可以通过bugreport把系统当前时刻点&#xff08;运行BugRepot的时刻&#xff09;的系统相关的状态和信息…

Redis中BitMap在钉钉机器人中的应用

性能分析 数据库中有1000w用户&#xff0c;每个用户签到一次&#xff0c;对应两个字段 连续签到多少次 、签到时间。 签到时间字段占用10个字节&#xff0c;连续签到多少天 占用5个字节&#xff08;假设一个用户能活100年&#xff0c;每天都签到&#xff0c;一个用户最多签到3…

【爬取研招网指定学校专业信息】

前言 本文介绍了如何使用 Python 的 requests 库和 BeautifulSoup 库来爬取研究方向信息&#xff0c;并将其保存为 CSV 文件。爬取的网站为“中国研究生招生信息网”&#xff08;https://yz.chsi.com.cn/&#xff09;。代码从指定的专业目录页面爬取研究方向的相关信息&#x…

ROM修改进阶教程------services.jar文件过小 合并odex apk合并odex 几种方法步骤解析

在上期博文中有说明去卡密等相关操作。但在安卓低版本中有些services.jar文件过小。大小不足1K,这种是无法直接反编译的。我们简单使用压缩软件打开查看。其中文件小的里面没有dex文件。这种需要我们先合并odex使其成为一个可以直接反编译的文件再来操作。操作也可以用于其他a…

Day 31 贪心算法理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和

贪心算法理论基础 ​ 贪心算法的本质&#xff1a;选择每一个阶段的局部最优&#xff0c;从而达到系统的整体最优&#xff1b; ​ 贪心的套路就是没有套路&#xff0c;最好的策略就是举反例&#xff0c;因为大多数时候并不要求严格证明&#xff0c;只需要得到普遍性结论即可&a…

Linux之ebpf(1)基础使用

Linux之ebpf(1)基础使用 Author: Once Day Date: 2024年4月20日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可以参考专栏&#xff1a;Linux基础知识_Once-D…