ACwing 1081. 度的数量

news2024/11/25 1:48:34

文章目录

  • 题意
  • 思路
  • 代码

题意

给你一段区间[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;
            else
                c[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; //统计前面右边已经用多少个1

    for(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]; //左边不为1
            if(x > 1) //因为左边是0~x-1,如果x不大于1那么我左边就不能选1,所以我左边能选1的情况一定是x要大于1才行。
            {
                if(k - last -1 >= 0)res += c[i][k-last-1]; //因为只能取k个1,还要减去前面右边用了多少个1
                break;
            }
            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.coloradmin.cn/o/794883.html

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

相关文章

行为型设计模式之策略模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

OpenCV实现高斯模糊加水印

# coding:utf-8 # Email: wangguisendonews.com # Time: 2023/4/21 10:07 # File: utils.pyimport cv2 import PIL from PIL import Image import numpy as np from watermarker.marker import add_mark, im_add_mark import matplotlib.pyplot as plt# PIL Image转换成OpenCV格…

Docker 全栈体系(六)

Docker 体系&#xff08;高级篇&#xff09; 三、Docker微服务实战 1. 通过IDEA新建一个普通微服务模块 建Module docker_boot 改POM <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" …

【C#】医学实验室云LIS检验信息系统源码 采用B/S架构

基于B/S架构的医学实验室云LIS检验信息系统&#xff0c;整个系统的运行基于WEB层面&#xff0c;只需要在对应的工作台安装一个浏览器软件有外网即可访问&#xff0c;技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等。 一、系统概况 本系统是将各种生化、免疫、…

当ChatGPT应用在汽车行业,具体有哪些场景?

​ ChatGPT有潜力彻底改变汽车行业并将其提升到新的高度。在ChatGPT的加持下&#xff0c;该行业的多个领域都将取得重大变化。 利用ChatGPT作更高级的虚拟助理 你可能用过现有的虚拟助理&#xff0c;它们一系列的回复有时候让人不得不感叹一句“人工智障”&#xff01;然而&a…

【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟

目录 1.认识时钟树&#xff08;掌握&#xff09;1.1什么是时钟&#xff1f;1.2认识时钟树&#xff08;F1&#xff09;1.2.1STM32F103时钟树简图1.2.2STM32CubeMX时钟树&#xff08;F103&#xff09; 1.3认识时钟树&#xff08;F4&#xff09;1.3.1F407时钟树1.3.2F429时钟树1.3…

【C++】解决菱形继承而产生的虚基表(偏移量表)

文章目录 继承概念切片和重定义派生类的默认成员函数菱形虚拟继承 继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派…

LeetCode91.Decode-Ways<解码方法>

题目&#xff1a; 思路&#xff1a; 关键在于有没有0,其次能不能二位.二位的要求是在 1-- 26的范围内.所以动态规划的时候需要限制. 代码是&#xff1a; //codeclass Solution { public:int numDecodings(string s) {int n s.size();vector<int> dp(n1, 0); // 定义状…

java使用htmlunit + jsoup 爬网站图片案例(爬虫学习)

申明 该文章用于自己学习爬虫使用 案例分析 目的: 从百度图片中搜索"风景"并下载图片到本地 思路: 使用htmlunit进行模拟用户操作, 并使用jsoup对数据进行解析,获取到需要的数据后,再下载到本地保存 htmlunit官网 jsoup官网 操作步骤 使用谷歌浏览器打开百度图片…

用html+javascript打造公文一键排版系统8:附件及标题排版

最近工作有点忙&#xff0c;所 以没能及时完善公文一键排版系统&#xff0c;现在只好熬夜更新一下。 有时公文有包括附件&#xff0c;招照公文排版规范&#xff1a; 附件应当另面编排&#xff0c;并在版记之前&#xff0c;与公文正文一起装订。“附件”二字及附件顺序号用3号黑…

Mysql适用于初学者的前期入门资料

文章目录 前言一、SQL语句分类二、SQL语句的书写规范三.数据库操作四、MySQL字符集1、问题① 五、UTF8和UTF8MB4的区别六、数据库对象七、数据类型八、表的基本创建1、创建表2、查看表3、删除表4、修改表结构5、复制表的结构 九、数据库字典十、表的约束1、非空约束(NOT NULL)2…

matplotlib从起点出发(4)_Tutorial_4_Lifecycle

1 一幅图像的生命周期 本教程旨在揭示使用matplotlib绘制的一幅图像的生命周期&#xff0c;包括它的开始、中间和结束。我们将从一些原始数据开始&#xff0c;最后保存自定义可视化的图形。在此过程中&#xff0c;我们尝试使用matplotlib突出一些简洁的功能和最佳实践。 2 关…

【Matlab】基于粒子群优化算法优化BP神经网络的时间序列预测(Excel可直接替换数据)

【Matlab】基于粒子群优化算法优化BP神经网络的时间序列预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码5.1 fun.m5.2 main.m 6.完整代码6.1 fun.m6.2 main.m 7.运行结果 1.模型原理 基于粒子群优化算法&#xff08;Pa…

【LeetCode 75】第九题(443)压缩字符串

目录 题目: 示例: 分析: 题目: 示例: 分析: 给一个字符串,如果该字符有连续的相同的字符,则只保留一个字符,并在该字符后加上该字符连续的数量.例如原数组为 [a,a,a],则因为字符a连续了三次,因此可以压缩为[a,3],我们需要注意的是数字也需要是字符,则如果字符连续次数不止有…

SpringCloud学习路线(13)——分布式搜索ElasticSeach集群

前言 单机ES做数据存储&#xff0c;必然面临两个问题&#xff1a;海量数据的存储&#xff0c;单点故障。 如何解决这两个问题&#xff1f; 海量数据的存储问题&#xff1a; 将索引库从逻辑上拆分为N个分片&#xff08;shard&#xff09;&#xff0c;存储到多个节点。单点故障…

C++笔记之memset分析

C笔记之memset分析 code review! 文章目录 C\笔记之memset分析1.介绍2.误区总结3.代码一&#xff0c;char数组和uint8_t使用memset4.代码三&#xff0c;int数组使用memset 1.介绍 2.误区总结 参考文章&#xff1a;Cmemset踩坑 3.代码一&#xff0c;char数组和uint8_t使用mem…

2023年河北省研究生数学建模竞赛D题中国钢铁工业低碳转型与高质量发展路径优化研究思路和代码

D题中国钢铁工业低碳转型与高质量发展路径优化研究 目前已写出D题初步代码&#xff0c;下载地址&#xff1a;【2023年河北省研究生数学建模竞赛D题初步思路和代码-哔哩哔哩】 https://b23.tv/g2ATbX5 随着我国工业化、城镇化进程的加快和消费结构持续升级&#xff0c;能源需求…

tty(五)串口的打开过程

一、字符设备完成注册 我们知道&#xff0c;在serial核心层提供了2个重要接口 uart_register_driver uart_add_one_port 上者通过调用tty核心的接口&#xff0c;完成了tty_driver的动态分配和注册&#xff0c;然而此时并没有看到创建字符设备&#xff0c; 通过对uart_add_one…

货拉拉基于 Flink 计算引擎的应用与优化实践

摘要&#xff1a;本文整理自货拉拉实时研发平台负责人王世涛&#xff0c;在Flink Forward Asia 2022 平台建设专场的分享。本篇内容主要分为六个部分&#xff1a; Flink 在货拉拉的使用现状Flink 平台化性能优化主题数据准确性主题稳定性主题未来展望 点击查看原文视频 & 演…

【leetcode】链表的中间节点|链表中倒数第k个节点

目录 1.链表的中间节点 2.链表中倒数第k个节点 1.链表的中间节点 思路1&#xff1a;遍历链表&#xff0c;统计节点个数count&#xff0c;返回第count/2 1个节点 &#x1f4d6;Note:注意循环条件为--mid&#xff0c;--mid循环执行mid-1次&#xff0c;mid--循环mid次&#xf…