Acwing 1081. 度的数量(以及本人对数位dp的浅薄理解)

题意:

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

题解:

数位DP
技巧1:[X,Y]=>f(Y)-f(X-1)
技巧2:用树的方式来考虑。

在本题中,题意是问[X,Y]中的数 转发成B进制,B进制有K位是1
比如样例中:17 ,k=2,B=2
就是把17转成二进制,看二进制中是否有K个1
17的二进制是:10001,说明17=24+20,符合要求
我们现在想具体做法:我们利用前缀和的方式,想法1~n之间符合要求的个数,这样就可以方便求出任意区间的数量。
对于一个N位数,我们将N的各位拆成an-1到a0(从高到底),然后我们用树的形式来考虑,对于最高位an-1,他可以是an-1或者是0到an-1-1之间的数,如果是0到an-1-1之间的数,我们具体讨论,如果是1,说明剩下位置是需要k-1个1,如果是非1,剩下位置只需要k个1,直接用组合数就可以表示(如图),而对于第an-1位是an-1的话我们可以继续分解
在这里插入图片描述
参考题解(下图来源)
在这里插入图片描述

谈谈我对数位dp的理解,为什么要拆分成左右两侧,左侧是0 ~ an-1,右侧为an,我的理解:数位dp就是一种优化的统计的方式,因为我们计算的是1~n中所有满足答案的情况,那统计的x一定要小于等于n,我们将n拆成各位,我们从高位向低位枚举时,假如说n是7854,我们将n拆成开,就是4位,从高到低分别是7,8,5,4,我们在枚举第一位(最高位时),最高位如果我们枚举0 ~ 6,那么后三位可以是任意数,因为肯定比7854小,对不对,然后统计这部分答案。如果我们枚举是7,那你后三位不能随便枚举,如果你第二位枚举9,那就超出范围了,为了避免超出范围,如果我们第一位枚举7,那我们就看第二位,第二位的上限是8,那我们就枚举 0 ~ 7 ,这样后两位就可以随便枚举,统计答案,然后我们第二位取上限8,再往后推一位。。。依次类推,终点就是我们推到7854,就是n本身(我们在推的过程中是加了判断条件,如果不满足条件就break,如果能推到最后,说明最终这个n也是满足条件的)。这样说不知道能不能理解

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 35; //位数int f[N][N];// f[a][b]表示从a个数中选b个数的方案数,即组合数int K, B; //K是能用的1的个数,B是B进制//求组合数:预处理
void init(){for(int i=0; i< N ;i ++)for(int j =0; j<= i ;j++)if(!j) f[i][j] =1;else f[i][j] =f[i-1][j] +f[i-1][j-1];
}//求区间[0,n]中的 “满足条件的数” 的个数//“满足条件的数”是指:一个数的B进制表示,其中有K位是1、其他位全是0
int dp(int n){if(n == 0) return 0; //如果上界n是0,直接就是0种vector<int> nums; //存放n在B进制下的每一位//把n在B进制下的每一位单独拿出来while(n) nums.push_back( n% B) , n/= B;int res = 0;//答案:[0,n]中共有多少个合法的数//last在数位dp中存的是:右边分支往下走的时候保存前面的信息 //遍历当前位的时候,记录之前那些位已经占用多少个1,那么当前还能用的1的个数就是K-lastint last = 0; //从最高位开始遍历每一位for(int i = nums.size()-1; i>= 0; i--){int x = nums[i]; //取当前位上的数if(x>0){ //只有x>0的时候才可以讨论左右分支//当前位填0,从剩下的所有位(共有i位)中选K-last个数。//对应于:左分支中0的情况,合法res += f[i][ K -last];//i个数中选K-last个数的组合数是多少,选出来这些位填1,其他位填0if(x > 1){//当前位填1,从剩下的所有位(共有i位)中选K-last-1个数。//对应于:左分支中填1的情况,合法if(K - last -1 >= 0) res += f[i][K -last -1];//i个数中选K-last-1个数填1的组合数是多少//对应于:左分支中其他情况(填大于1的数)和此时右分支的情况(右侧此时也>1),不合法!!!直接break。break;}//上面统计完了**左分支**的所有情况,和右分支大于1的情况,//这个else 是x==1,//对应于:右分支为1的情况,即限定值为1的情况,也就是左分支只能取0//此时的处理是,直接放到下一位来处理//只不过下一位可使用的1的个数会少1,体现在代码上是last+1else if(x==1)//相当于限定值为1 {last ++;//如果已经填的个数last > 需要填的个数K,不合法breakif(last > K) break;}}//上面处理完了这棵树的**所有**左分支,就剩下最后一种右分支的情况// 也就是遍历到最后1位,在vector中就是下标为0的地方:i==0;// 并且最后1位取0,才算作一种情况res++。因为最后1位不为0的话,已经被上面的ifelse处理了。if(i==0 && last == K) res++; }return res;
}int main(){init();int l,r;cin >>  l >> r >> K >>B;cout<< dp(r) - dp(l-1) <<endl;  
}

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

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

相关文章

EFCore动态切换Schema

最近做个分库分表项目&#xff0c;用到schema的切换感觉还是有些坑的&#xff0c;在此分享下。 先简要说下我们的分库分表分库分表规则我定的规则是&#xff0c;订单号&#xff08;数字&#xff09;除以16&#xff0c;得出的结果为这个订单所在的数据库&#xff0c;然后他的余数…

东莞.NET俱乐部线下技术沙龙-活动报名

自广州.NET技术俱乐部在2018年12月08日线下活动顺利开展后&#xff0c;东莞作为兄弟城市&#xff0c;也想通过线下活动的方式&#xff0c;点燃东莞.NET技术的熊熊之火。现决定先借助广州、深圳兄弟城市的帮助下&#xff0c;开展一场东莞方主办的线下活动&#xff0c;聚集东莞本…

如何撰写较受欢迎的技术文章

本来我这篇文章的标题是 “如何撰写受欢迎的技术文章”&#xff0c;但反复斟酌之下&#xff0c;还是加了一个“较”字&#xff0c;这主要是考虑我不是什么知名作者&#xff0c;写的文章大多也谈不上很受欢迎&#xff0c;贸然地谈“受欢迎” 是有点忐忑的&#xff0c;而改成现在…

Recursive sequence HDU - 5950

Recursive sequence HDU - 5950 题意&#xff1a; 给你一个式子&#xff1a;f[n]2f[n-2]f[n-1]n4 给你f[1]和f[2]&#xff0c;给你一个n&#xff0c;求f[n] f[1],f[2],n<231 题解&#xff1a; 很明显&#xff0c;矩阵快速幂&#xff0c;但是太久没做这种题&#xff0c;我…

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

今天&#xff0c;Visual Studio中没有内置工具来测试WEB API。使用浏览器&#xff0c;只能测试http GET请求。您需要使用Postman&#xff0c;SoapUI&#xff0c;Fiddler或Swagger等第三方工具来执行WEB API的完整测试。在ASP.NET Core 2.2中&#xff0c;引入了一个名为“http-r…

Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)

本篇教程主要讲解基于容器服务搭建TeamCity服务&#xff0c;并且完成内部项目的CI流程配置。教程中也分享了一个简单的CI、CD流程&#xff0c;仅作探讨。不过由于篇幅有限&#xff0c;完整的DevOps&#xff0c;我们后续独立探讨。 为了降低容器的使用门槛以及便于大家将容器技…

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj&#xff0c;不过全过程是手工进行的&#xff0c;而且到最后处理 XAML 问题也非常头疼。现在&#xff0c;我们可以利用工具自动地完成这个过程。…

ASP.NET Core 自定义认证方式--请求头认证

Intro最近开始真正的实践了一些网关的东西&#xff0c;最近写几篇文章分享一下我的实践以及遇到的问题。本文主要介绍网关后面的服务如何进行认证。解决思路网关可以做一部分的认证和授权&#xff0c;服务内部有时候也会需要用户的信息&#xff0c;这时该怎么办呢&#xff0c;我…

P7516 [省选联考 2021 A/B 卷] 图函数

解析 纯纯的人类智慧题。 关键性质&#xff1a;vvv 可以在计算 f(u,G)f(u,G)f(u,G) 时产生贡献&#xff0c;当且仅当 GGG 中 u,vu,vu,v 之间可以通过 [v,n][v,n][v,n] 的点互相到达。 充分性较为显然&#xff0c;编号更大的点不会比 vvv 先删去&#xff0c;所以必然在 vvv 时…

开发语言大爆炸的时代,究竟谁主沉浮?

开发语言大爆炸的时代&#xff0c;究竟谁主沉浮&#xff1f;当这个系列本来打算是写人物的&#xff0c;而且是写我们身边那些优秀的开发者&#xff0c;然而当第一篇文章&#xff0c;写的是关于我们长沙.NET社区的优秀开发者邹琼俊&#xff0c;发表在博客园之后&#xff0c;有一…

Asp.NETCore轻松学系列阅读指引目录

前言耗时两个多月&#xff0c;坚持写这个入门系列文章&#xff0c;就是想给后来者更好更快的上手体验&#xff0c;这个系列可以说是从入门到进阶&#xff0c;适合没有 .NETCore 编程经验到小白同学&#xff0c;也适合从 .NET Framework 迁移到 .NETCore 的朋友。本系列从安装环…

eShopOnContainers 知多少[9]:Ocelot gateways

引言客户端与微服务的通信问题永远是一个绕不开的问题&#xff0c;对于小型微服务应用&#xff0c;客户端与微服务可以使用直连的方式进行通信&#xff0c;但对于对于大型的微服务应用我们将不得不面对以下问题&#xff1a;如何降低客户端到后台的请求数量&#xff0c;并减少与…

Acwing 1072. 树的最长路径

Acwing 1072. 树的最长路径 题意&#xff1a; 每个边有权值&#xff0c;求树的直径 题解&#xff1a; 两遍dfs可以求&#xff0c;这里用树形dp的方法&#xff0c;我们将1作为根节点来看这棵树 我们可以将点看作是钉子&#xff0c;边就是挂在钉子上的绳子&#xff0c;我们只…

.NET/C# 获取一个正在运行的进程的命令行参数

在自己的进程内部&#xff0c;我们可以通过 Main 函数传入的参数&#xff0c;也可以通过 Environment.GetCommandLineArgs 来获取命令行参数。但是&#xff0c;可以通过什么方式来获取另一个运行着的程序的命令行参数呢&#xff1f;进程内部获取传入参数的方法&#xff0c;可以…

听说,霸都.NET技术社区准备搞线下聚会了?

.NET Core实战项目交流群日常交流嗨&#xff0c;你听说了没有&#xff1f;霸都.NET技术社区准备搞线下聚会了&#xff01;啥时候的事情啊&#xff1f;最近才知道的消息啊&#xff01;那你是从哪里知道的消息呢&#xff1f;.NET Core项目实战交流群&#xff08;637326624&#x…

P4383 [八省联考 2018] 林克卡特树(wqs二分、树形dp)

解析 它还真的不难。 乐。 这题没做出来有些谔谔。 外层wqs二分显而易见&#xff0c;里面不知道为啥我总觉得这个题可以贪心。 然后一直试图在原树直径上下功夫&#xff0c;一筹莫展。 看到题解“dp”两个字这题也就做完了… 就相当于要把一棵树分成若干条无交链&#xff0c;每…

ASP.NET Core中实现单体程序的事件发布/订阅 - LamondLu - 博客园

标题&#xff1a;ASP.NET Core中实现单体程序的事件发布/订阅作者&#xff1a;Lamond Lu地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10468058.html项目源代码&#xff1a;https://github.com/lamondlu/EventHandlerInSingleApplication背景事件发布/订阅是一种非常强大…

Joy of Handcraft Gym - 102822J(线段树或差分)

Joy of Handcraft Gym - 102822J 题意&#xff1a; 每个灯有亮的周期和亮度&#xff0c;问1~m这段时间灯光最亮是多少 题解&#xff1a; 线段树维护区间最大值 根据灯的周期向这段区间加亮度k&#xff0c;然后利用线段树维护区间最大值 但是这样会超时&#xff0c;加个小优…

.NET Core 使用 HttpClient SSL 请求出错的解决办法

问题使用 HTTP Client 请求 HTTPS 的 API 时出现 The certificate cannot be verified up to a trusted certification authority 异常&#xff0c;并且证书已经传入。下面就是问题代码&#xff1a;public class Program{public static void Main(string[] args){var url &quo…

微软4年后重登市值第一,纳德拉如何做到的?

他用4年多时间将微软的市值提高了5000亿美元&#xff0c;超越苹果再次成为全球市值最高的上市公司。译 | 达达萨提亚纳德拉&#xff08;Satya Nadella&#xff09;2014年刚刚执掌微软时&#xff0c;微软当时是一个日渐没落的帝国。但在他领导的4年多时间里&#xff0c;微软百花…