好数

jzoj 1521

题目大意:

定义好数为转换为二进制后,有至少三个连续的位相同的数,现在要求一个范围内的好数个数

样例输入

0 16

样例输出

5

数据范围限制

0 <= Low <= UP <= 2147483647

提示

提示:

对于50%测试,0 <= Low <= UP <= 100000。

解题思路:

我们可以用前缀和来求,就把问题转换为了前n个数中好数的个数
它让我们求好数,但因为好数特别难求,所以我们可以求‘坏数’,就是没有连续三个位是一样的数
我们先用数位DP求出多少位以什么开头的坏数总数
然后我们把他分位数小于n的位数的和等于n的位数的
小于的:
我们就可以直接用已经求出来的坏数总数,然后分为不同位数的直接加就行了
如1…1100100先分为1位,2位,3位,4位,5位,6位的类型
等于的:
就从大到小把1变成0,这样就一定小于n了,然后分别计算
最后还要计算n
然后用n减去坏数的个数就得到了好数的个数了

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
ll a,b,s[40],f[40][5][5];
ll js(ll now)
{ll sum=1;for (int i=now-1;i>0;--i)sum+=f[i][1][0]+f[i][1][1];//小于的(第一类)for (int i=now-1;i>0;--i){if (s[i]==1)if (s[i+1]==1||s[i+2]==1||i==now-1)//把1改为0sum+=f[i+1][s[i+1]][0];相加if (s[i]==s[i+1]&&s[i+1]==s[i+2]&&i!=now-1)//判断是不是已经成为了好数了{sum--;break;}}return sum;
}
ll ans(ll dep)
{if (dep<=0) return 0;ll l=dep,tot=0;memset(s,0,sizeof(s));while (l) s[++tot]=l&1,l>>=1;//转二进制return dep-js(tot);//求好数
}
int main()
{f[1][1][0]=1;f[1][0][1]=1;for (int k=2;k<=35;++k){f[k][0][0]=f[k-1][0][1];//数位DPf[k][0][1]=f[k-1][1][1]+f[k-1][1][0];f[k][1][0]=f[k-1][0][0]+f[k-1][0][1];f[k][1][1]=f[k-1][1][0];}scanf("%lld %lld",&a,&b);printf("%lld",ans(b)-ans(a-1));//前缀和求职
}

【数位DP】好数(jzoj 1521)相关推荐

  1. Good Bye 2017 G. New Year and Original Order 数位dp + 按数贡献

    传送门 文章目录 题意: 思路: 题意: 定义S(k)S(k)S(k)为将kkk的每一位拿出来从小到大排序后构成的数,比如S(3421)=1234S(3421)=1234S(3421)=1234,求S ...

  2. 数位DP --Windy数

    满足一下条件的数字称为windy数 不考虑前导0,所有相邻的两个数字的差至少为2. 求出任意区间内的所有windy数 思路:dp[i][j]表示所有长度为 i 的数字以 j 开头的windy数的个数. ...

  3. bzoj 1026: [SCOI2009]windy数 数位DP算法笔记

    数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...

  4. uestc 250 windy数(数位dp)

    题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 思路:数位dp #include<iostream ...

  5. 【bzoj1026】[SCOI2009]windy数 数位dp

    题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 输入 包含两个整数 ...

  6. BZOJ1026 [SCOI2009]windy数 数位dp

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1026 题目概括 求区间[A,B]中有多少数满足下面的条件. 条件:该数相邻两位之差不小于2. 题解 ...

  7. 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)...

    链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  8. 理解至上:数位dp(ybtoj-B数计数)

    文章目录 简要 题目描述 解析 dp定义: 试填法 代码 thanks for reading! 简要 数位dp,天下第一 最重要的应该有两个: 1.状态转移式的确定 2.试填法不断往后模拟 (至今是 ...

  9. 【2018.4.7】模拟赛之一-ssl2382 K好数【数位dp】

    正题 大意 如果一个数每一位都小于k那么这个数是好数.给出n和k,求1-n里有多少个好数. 解题思路1 将起改为一个k+1进制的数,那么每次加1后这个数都是好数.然后判断一下是否大于n(十进制的情况下 ...

最新文章

  1. 音视频技术开发周刊 | 234
  2. python判断序列符号变化的次数
  3. 利用宝塔部署若依前后分离项目(详细教程)
  4. 阅读笔记《梦断代码》其二
  5. AC日记——可能的路径 51nod 1247
  6. 以德服人——合格的产品经理
  7. Python下time模块和datetime模块的使用
  8. 199的Eagle一点都不香了!这款Billfish,让你不花钱免费“嫖”
  9. 修改Layui表单验证提示框样式
  10. 教你快速录制gif动图
  11. 2年前端 杭州 面试 集合 面经 前端
  12. 2020腾讯实习生招聘面试算法题
  13. 人工智能时代,数据标注产业将迎来黄金时期?丨曼孚科技
  14. Android调用系统应用打开各种类型文件
  15. 八、vue_options之computed、watch属性选项
  16. 博图14软件安装顺序_博图v14安装顺序和教程
  17. 马丁富勒微服务论文学习
  18. 阿里云服务器ECS利用反向代理FRP内网穿透
  19. Android Studio 用USB连接到真机调试方法
  20. 两个向量叉乘(定义是类似多项式相乘再求和)和点乘(定义是对应位置的坐标相乘再求和)的定义和证明,以及和四元数乘法的联系和区别

热门文章

  1. require引入js vue_请教 关于使用require 引入vue 和公共js的问题
  2. iphone查看删除的短信_手机资讯:iPhone手机可以批量删除短信吗如何操作
  3. linux网卡驱动 pdf,Linux下网卡驱动程序.pdf
  4. 算法设计与分析——回溯法——批处理作业调度
  5. 7-37 模拟EXCEL排序 (25 分)(思路+详解+超时解决 兄弟们冲呀呀呀呀呀呀)
  6. 创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L)
  7. [SpringSecurity]web权限方案_用户授权_基于权限访问控制_基于角色访问控制_hasAuthority和hasAnyAuthority_hasRole和hasAnyRole
  8. [JavaWeb-Servlet]Servlet_执行原理
  9. [Java基础]Math类的常用方法
  10. LeetCode 530二叉搜索树的最小绝对值差-简单