1585 Amount of Degrees

给定一个区间,求区间内满足条件的数有几个,是一个数位DP
对于数位DP,我悟得还是不如区间DP线性DP那样透
好了开始步入正题
所以,这道题就是和进制有很大的关系,给定区间X,Y使得X,Y之间,X个B+B+…+
如果和进制有关系,那么就想起来了和之前练递推的时候做过的一道题——递推树
所求数是不想等的整数幂之和,系数只能是1或者0,这样,所有的进制都和二进制相似了
如果将进制表示成树的话,那么问题就转换如何统计一个高度为i的二叉树恰好有j个1的个数,方程f[i][j]=max(f[i][j],f[i-1][j]+f[i-1][j-1]),我们预处理f,用二叉树每次从根开始走向右二子的时候统计左儿子的个数
在黑板上简单画画其实很好理解这一道题
最后,就是如何处理非二进制的情?
刚才说过系数只能是1或者0,也就是我们假设的B叉树只有0和1儿子能用的,也就是要么是本身要么不存在
为什么?我也想了很久,在黑板上接着推推
因为如果系数不是0或者1,就无法用B的次幂来表示,比如3进制如果有2,就不能通过3的次幂来表示,所以系数为2就更不可能了
所以我们需要从最高位开始找到第一个不是0或1的位置,后面的全部改成1,这样能保证最接近原数

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;//那么这道题就转化为从0-13的二进制数中找出有三个1的数有几个
const int SIZE=55;
int x,y;
int k,b;
int f[SIZE][SIZE];
void init()
{f[0][0]=1;//0高度恰好有0的1的个数for(int i=1;i<=35;i++){f[i][0]=f[i-1][0];//不管高度,最起码都和前面有相同for(int j=1;j<=i;j++)f[i][j]=f[i-1][j]+f[i-1][j-1];//左右子树 }
}
int sol(int x,int k)
{int ans,tot;ans=tot=0;for(int i=31;i;i--)//最高位开始 {if( x&(1<<i) )//当前位为1 {tot++;//统计1的个数 if(tot>k) break;//统计k个1x^=(1<<i);//求和 }if( x&1<<(i-1) ){ans+=f[i-1][k-tot];//朝右子树 } }if(x+tot==k) ans++;return ans; }
int dfschange(int n,int b)//n转换b进制并且更改01
{int i,tot,ans;i=tot=ans=0;int num[SIZE]={0};while(n){num[tot++]=n%b;n/=b;} i=tot-1;//最高位开始 while(num[i]<=1) i--;//找到一个不是0或1 while(i>=0){num[i]=1;i--;}//当成了二进制转换成十进制 while(tot>=0){ans=ans*2+num[tot]; tot--;}return ans;}
int main()
{cin>>x>>y>>k>>b;init();if(b==2){cout<<sol(y,k)-sol(x-1,k)<<endl;//二进制直接计算 }else{x=dfschange(x,b);y=dfschange(y,b);//非二进制进行更改成二进制,然后转换十进制 cout<<sol(y,k)-sol(x-1,k)<<endl; } return 0;
}

1585 Amount of Degrees相关推荐

  1. 【算法•日更•第十二期】信息奥赛一本通1585:【例 1】Amount of Degrees题解

    废话不多说,直接上题: 1585: [例 1]Amount of Degrees 时间限制: 1000 ms         内存限制: 524288 KB 提交数: 130     通过数: 68 ...

  2. Amount of Degrees

    ural 1057 Amount of Degrees 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K 个互不相等的B的整数次幂之和. 分析: 所求的数为互不相等的幂之和,即起B进制表 ...

  3. timus-1507 Amount of Degrees 按位DP

    http://acm.timus.ru/problem.aspx?space=1&num=1057 其实这题可以算是一个组合数的题目了,主要是将基于其他进制转化为基于2进制的算法,对于某一位不 ...

  4. 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》

    虽然2012年出版的老书了,但是是由三次世界冠军的上海交大ACM队出版的书籍,选择的题目是ACM经典中的经典,书中有非常详细的题解,可以学到很多东西,值得一刷. 目录 第一部分 第一章 数学 1.1 ...

  5. 数位dp 的简单入门

    时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数 ...

  6. 动态规划 —— 数位 DP

    [概述] 数位 DP 实际是一种计数用的 DP,一般就是统计一个区间 [le,ri] 内满足一些条件数的个数. 所求的限定条件往往与数的位数有关,例如:数位之和.指定数码个数.数的大小顺序分组等. 题 ...

  7. double 最大_LeetCode 1610—可见点的最大数目

    关键字:计算几何,滑动窗口 归航return:LeetCode 460-LFU 缓存设计​zhuanlan.zhihu.com 归航return:(Trivial)LeetCode 1354--多次求 ...

  8. java robot api_java机器人API学习笔记

    robocode 部分 API 中文参考 ahead 向前 public void ahead(double distance) Immediately moves your robot ahead ...

  9. 《信息学奥赛一本通》提高版题单

    第一部分 基础算法 第 1 章 贪心算法 #10000 「一本通 1.1 例 1」活动安排 #10001 「一本通 1.1 例 2」种树 #10002 「一本通 1.1 例 3」喷水装置 #10003 ...

  10. C语言字符数组显示钻石,c++两种字符串赋值方式 并介绍 C语言下遍历目录文件的方式...

    c++字符串声明:一种是声明字符数组并赋值,另一种是直接声明string类 #define _CRT_SECURE_NO_WARNINGS #include #include #include &qu ...

最新文章

  1. 【转摘】Word中查找与替换的妙用
  2. poj 3662 Telephone Lines(好题!!!二分搜索+dijkstra)
  3. 能源动力与计算机科学交叉,深入落实学科交叉融合战略,能源与动力学院、计算机科学与技术学院、材料科学与技术学院研讨智能发动机技术...
  4. findstr()与strfind()的区别
  5. mysql sql优化_Mysql的SQL优化指北
  6. CICD详解(五)——SVN安装与配置
  7. WGestures鼠标手势快捷手势介绍
  8. 仿真建模与仿真程序设计 Python
  9. MIDI通信协议-数据字节:GM1旋律乐器音色库(带中文名称)
  10. USB3.0剖析(锆石科技FPGA)
  11. 《前端中文入门手册》.pdf
  12. 如何提高仓库操作管理效率?
  13. 江苏省2022年普通高校专转本选拔考试 计算机专业大类专业综合基础理论 试题卷
  14. 高斯混合模型(GMM)实现和可视化
  15. 全网最细的Spring教程(一)
  16. 3行代码用python实现图片格式转换
  17. 地球,再一次完成了绝妙的自转 ......
  18. CNI(Container Network Plugin)
  19. 如何在IIS中配置https
  20. Java菜单(菜单条、菜单和菜单项)

热门文章

  1. Php—— 1.apache2.4.x+php7.x
  2. 使用spss求标准化的线性回归方程
  3. 云计算基础架构实施要经历三个阶段
  4. Ubuntu安装opencv的扩展模块-viz模块
  5. 电压源和电流的关联参考方向_电压电流为关联参考方向.PPT
  6. 项目管理44个过程输入输出工具技术巧记法
  7. HDOJ 5143 NPY and arithmetic progression DFS
  8. 有限自动机可解析数据例题分析
  9. python爬虫随心所欲地爬取百度图片
  10. Java Swing 如何设置图片大小