ACwing 1081. 度的数量

文章目录

  • 题意
  • 思路
  • 代码

题意

给你一段区间[x, y]求其中满足一个数恰好等于K个互不相等的B的整数次幂之和的数的个数。
例如:x = 15, y = 20, k = 2, b = 2,那么对于这个区间有且仅有三个数满足题意:
17 = 2 4 + 2 0 = 10001 17 = 2^4+2^0 =10001 17=24+20=10001
18 = 2 4 + 2 1 = 10010 18 = 2^4+2^1=10010 18=24+21=10010
20 = 2 4 + 2 2 = 10100 20 = 2^4+2^2=10100 20=24+22=10100

思路

对于这种题型一眼就看出是数位DP了。那么对于数位DP的技巧我在上一篇博客提到过链接: 数位DP技巧但是对于上一篇博客只是对于技巧1和分类讨论作了明确的说明,但是对于技巧2结合树形结构并没有细说。那么对于本题我们采用技巧2对于我们解决很有帮助。首先得知技巧1我们能够通过前缀和的方式。来求出问题提到符合区间的个数也就是f[y]-f[x-1]。那么我们如何求出区间[1,N]的符合条件的个数呢。

首先我们先分析一下本题。什么数才是满足条件的,其实就是将一个数转化成b进制,这个数有且仅有k个1出现就是符合条件的数。
那么现在我们将N转化成b进制得到n位数分别是 a n − 1 , a n − 2 , . . . , a 0 a_{n-1},a_{n-2},...,a_0 an1,an2,...,a0
在这里插入图片描述
那么我们按照以上的分法我们可以看出对于每一位的右侧我们是固定的。那么对于左侧的情况我们是不确定的。如果我们能够直接算出每一位左边的情况而不是枚举的话显然这样大大的节约了时间。实际上绝大多数的数位DP问题就是像上述一样将这个区间的最大值分成n位数。然后按照上述的分法去分类讨论每一位的情况。那么对于左边的算法的话一般就是利用动态规划或者排列组合去计算。对于本题来说我们是要看这n位b进制数有多少种选法使得有k个1。那么以最高位举例来说。对于右边来说我们没多大讨论的。如果是左侧选1的话那么对于后面的n-1位就要选出k-1个1出来也就是有 c n − 1 k − 1 c_{n-1}^{k-1} cn1k1种情况。如果左侧不选一的话对于后面n-1位来说就要选出k个1也就是有 c n − 1 k c_{n-1}^{k} cn1k种情况了。所以对于最高位如果 a n − 1 a_{n-1} an1大于1那么一共就会有 c n − 1 k − 1 + c n − 1 k c_{n-1}^{k-1} + c_{n-1}^{k} cn1k1+cn1k贡献。为什么是大于1代码里面会细说。

代码

#include<bits/stdc++.h>using namespace std;const int N = 35;int c[N][N];int l, r, k, b;void init() //递归求组合数
{for(int i = 0; i < N; i ++){for(int j = 0; j <= i; j ++){if(!j) c[i][j] = 1;elsec[i][j] = c[i-1][j] + c[i-1][j-1];}}
}int dp(int n)
{if(!n) return 0;vector<int> num;while(n){num.push_back(n%b);n /= b;}//拆分成n位b进制数n = num.size();int res = 0; //统计答案int last = 0; //统计前面右边已经用多少个1for(int i = n-1; i >= 0; i --){int x = num[i];// 求左边的情况,为什么这里不枚举[0~a_{n-1}],因为由题意知道我们是要看n位b进制数是否有k个1,我们这儿每一位只会取0和1。// 如果这一位为0,那么就进不去左边了。如果不为0那么我们才能进去。if(x){res += c[i][k-last]; //左边不为1if(x > 1) //因为左边是0~x-1,如果x不大于1那么我左边就不能选1,所以我左边能选1的情况一定是x要大于1才行。{if(k - last -1 >= 0)res += c[i][k-last-1]; //因为只能取k个1,还要减去前面右边用了多少个1break;}else // x = 1,只能右边为1{last++;if(last > k) break;}}if(!i && last == k) res++; //统计右边的情况。}return res;
}signed main()
{init();cin >> l >> r >> k >> b;cout << dp(r) - dp(l-1) << endl; //技巧1前缀和思想return 0;
}

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

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

相关文章

linux | vscode | makefile | c++编译和调试

简单介绍环境&#xff1a; vscode 、centos、 gcc、g、makefile 简单来说就是&#xff0c;写好项目然后再自己写makefile脚本实现编译。所以看这篇博客的用户需要了解gcc编译的一些常用命令以及makefile语法。在网上看了很多教程&#xff0c;以及官网也看了很多次&#xff0c;最…

前端开发实习总结参考范文

▼前端开发实习总结篇四 读了三年的大学&#xff0c;然而大多数人对本专业的认识还是不那么透彻&#xff0c;学的东西真正能够学以致用的东西很少&#xff0c;大家都抱怨没有实践的机会&#xff0c;在很多同学心里面对于本专业还是很茫然。直到即将毕业的时候才知道我们以前学…

uni-app中的uni.requireNativePlugin()

这个方法是用来引入原生插件的方法&#xff0c;自 HBuilderX 1.4 版本起&#xff0c;uni-app 支持引入原生插件&#xff0c;使用方式如下&#xff1a; const PluginName uni.requireNativePlugin(PluginName); // PluginName 为原生插件名称 引入插件的类型有三种&#xff1…

东南大学齿轮箱故障诊断(Python代码,CNN结合LSTM模型)

运行代码要求&#xff1a; 代码运行环境要求&#xff1a;Keras版本>2.4.0&#xff0c;python版本>3.6.0 1.东南大学采集数据平台&#xff1a; 数据 该数据集包含2个子数据集&#xff0c;包括轴承数据和齿轮数据&#xff0c;这两个子数据集都是在传动系动力学模拟器&am…

如何将电机控制器添加到您的 ROS 机器人

一、说明 如果您正在构建与 ROS/ROS2 一起使用的移动机器人,您需要做的第一件事就是集成电机控制器。电机控制器的目的是接受来自更高级别的软件(如导航堆栈)的消息,并将其转换为驱动电机的信号。它还将从电机的编码器接收信息,以计算机器人的速度和位置。 您可以…

WebGPU(七):C++头部封装

WebGPU(七)&#xff1a;C头部封装 在前面的学习中&#xff0c;我们使用的都是原生态的WebGPU API&#xff0c;那是基于C语言的API&#xff0c;但是为了更高效的开发&#xff0c;我们可以使用一个基于C的库。 根据参考的教程&#xff0c;这个github库提供更加纤细的描述。它提…

【计算机网络】计算机网络基础知识总结(秋招篇)

文章目录 前言计算机网络笔记TCP和UDP分别是什么 有什么区别基于TCP UDP这两个协议的上层协议有哪些&#xff1f;TCP和UDP分别在哪些领域被用的多&#xff1f;TCP实现可靠性传输用了哪些技术&#xff1f;&#xff08;TCP如何实现可靠性传输&#xff09;讲一下超时重传和超时定时…

全志F1C200S嵌入式驱动开发(触摸屏驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 触摸屏一般有两种,一种是电阻触摸屏,一种是电容触摸屏。前者需要自己买一颗i2c的信号读取芯片,用的比较多的是ns2009。后者自身集成了读取芯片,用的比较多的是gt911。正好之前测…

使用 HostAliases 向 Pod /etc/hosts 文件添加条目

某些情况下&#xff0c;DNS 或者其他的域名解析方法可能不太适用&#xff0c;您需要配置 /etc/hosts 文件&#xff0c;在Linux下是比较容易做到的&#xff0c;在 Kubernetes 中&#xff0c;可以通过 Pod 定义中的 hostAliases 字段向 Pod 的 /etc/hosts 添加条目。 适用其他方…

文件流,排序,下载

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 字符字节流&#xff0c;前升后降一、pandas是什么&#xff1f; 字符字节流&#xff0c;前升后降 浏览器下载需要设置两个头 responese .setHeader() 一个设置返回的…

C# Modbus TCP上位机测试

前面说了三菱和西门子PLC的上位机通信&#xff0c;实际在生产应用中&#xff0c;设备会有很多不同的厂家生产的PLC&#xff0c;那么&#xff0c;我们就需要一种通用的语言&#xff0c;进行设备之间的通信&#xff0c;工业上较为广泛使用的语言之一就是Modbus。 Modbus有多种连…

Pytorch从入门到精通:二、dataset与datalodar

数据是深度学习的基础&#xff0c;一般来说&#xff0c;数据量越大&#xff0c;训练出来的模型也越强大。如果现在有了一些数据&#xff0c;该怎么把这些数据加到模型中呢&#xff1f;Pytorch中提供了dataset和dataloader&#xff0c;让我们一起来学习一下吧&#xff0c;datase…

5-linux中的定时任务调度

定时任务调度 crond 任务调度概述基本语法常用选项快速入门应用实例crond 相关指令 at 定时任务基本介绍at 命令格式at 命令选项at 时间的定义其他指令 crond 任务调度 crontab 进行 定时任务调度 概述 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序 任务…

Webpack5 vue-loader和VueLoaderPlugin

文章目录 vue-loader和VueLoaderPlugin的作用vue-loader具体使用方式注意事项 vue-loader和VueLoaderPlugin的作用 .vue 文件是用户用 HTML-like 的语法编写的 Vue 组件。每个vue 文件都包括三部分 , VueLoaderPlugin 是一个解析 Vue.js 的插件&#xff0c;用于在 webpack 构…

360T7路由器进行WiFi无线中继教程

360T7路由器进行WiFi中继教程 1. 概述2. 360T7路由器进行WiFi中继实现教程2.1 登录路由器管理界面2.2 选择上网方式2.3 搜索WiFi2.4 连接WiFi2.5 点击确认2.6 在主页面查看网络 1. 概述 中继路由系统由一组中继路由器组成&#xff0c;为不能交换路由信息的路由域提供中继路由。…

Docker consul的容器服务更新与发现

&#xff08;1&#xff09;什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&am…

STP和MTP(第二十二课)

2、如何实现 1)在MSTP网络种,引入了域的概念,称为MST域 2)每一个MST域中包含一个或多个“生成树”称为“实例” 3)每个“实例生成树”都可以绑定vlan,实现vlan数据流的负载分担/负载均衡 4)默认情况下,所有的vlan都属于“实例树0:即:instance 0” 5)不同的“实例…

centos 8安装A10显卡驱动-AI人工智能

centos 8安装A10显卡驱动命令:./NVIDIA-Linux-x86_64-535.54.03.run --kernel-source-path/usr/src/kernels/4.18.0-147.el8.x86_64 安装完毕; 测试: 检查驱动版本号: nvidia-smi 验证驱动模块已加载: lsmod | grep nvidia

【Vue3】生命周期

beforeCreate&#xff0c;created 在setup 语法糖模式下是没有这两个生命周期的 App.vue <template><h1>Hello World</h1><!-- 通过v-if控制组件创建和销毁的生命钩子 --><A v-if"flag"></A><button click"flag !fla…

【腾讯云 Cloud Studio 实战训练营】沉浸式体验编写一个博客系统

文章目录 前言新建工作空间登录(注册)Cloud Studio 账号&#xff1a;进入 Cloud Studio 控制台&#xff1a;配置工作空间参数&#xff1a;确认并创建工作空间&#xff1a;项目搭建 配置nuxt 脚手架运行项目报错信息解决错误脚手架运行预览问题 开启博客代码配置layout首页配置 …