【数位DP】好数(jzoj 1521)
好数
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)相关推荐
- 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 ...
- 数位DP --Windy数
满足一下条件的数字称为windy数 不考虑前导0,所有相邻的两个数字的差至少为2. 求出任意区间内的所有windy数 思路:dp[i][j]表示所有长度为 i 的数字以 j 开头的windy数的个数. ...
- bzoj 1026: [SCOI2009]windy数 数位DP算法笔记
数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...
- uestc 250 windy数(数位dp)
题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 思路:数位dp #include<iostream ...
- 【bzoj1026】[SCOI2009]windy数 数位dp
题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 输入 包含两个整数 ...
- BZOJ1026 [SCOI2009]windy数 数位dp
欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1026 题目概括 求区间[A,B]中有多少数满足下面的条件. 条件:该数相邻两位之差不小于2. 题解 ...
- 牛客假日团队赛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 ...
- 理解至上:数位dp(ybtoj-B数计数)
文章目录 简要 题目描述 解析 dp定义: 试填法 代码 thanks for reading! 简要 数位dp,天下第一 最重要的应该有两个: 1.状态转移式的确定 2.试填法不断往后模拟 (至今是 ...
- 【2018.4.7】模拟赛之一-ssl2382 K好数【数位dp】
正题 大意 如果一个数每一位都小于k那么这个数是好数.给出n和k,求1-n里有多少个好数. 解题思路1 将起改为一个k+1进制的数,那么每次加1后这个数都是好数.然后判断一下是否大于n(十进制的情况下 ...
最新文章
- 音视频技术开发周刊 | 234
- python判断序列符号变化的次数
- 利用宝塔部署若依前后分离项目(详细教程)
- 阅读笔记《梦断代码》其二
- AC日记——可能的路径 51nod 1247
- 以德服人——合格的产品经理
- Python下time模块和datetime模块的使用
- 199的Eagle一点都不香了!这款Billfish,让你不花钱免费“嫖”
- 修改Layui表单验证提示框样式
- 教你快速录制gif动图
- 2年前端 杭州 面试 集合 面经 前端
- 2020腾讯实习生招聘面试算法题
- 人工智能时代,数据标注产业将迎来黄金时期?丨曼孚科技
- Android调用系统应用打开各种类型文件
- 八、vue_options之computed、watch属性选项
- 博图14软件安装顺序_博图v14安装顺序和教程
- 马丁富勒微服务论文学习
- 阿里云服务器ECS利用反向代理FRP内网穿透
- Android Studio 用USB连接到真机调试方法
- 两个向量叉乘(定义是类似多项式相乘再求和)和点乘(定义是对应位置的坐标相乘再求和)的定义和证明,以及和四元数乘法的联系和区别
热门文章
- require引入js vue_请教 关于使用require 引入vue 和公共js的问题
- iphone查看删除的短信_手机资讯:iPhone手机可以批量删除短信吗如何操作
- linux网卡驱动 pdf,Linux下网卡驱动程序.pdf
- 算法设计与分析——回溯法——批处理作业调度
- 7-37 模拟EXCEL排序 (25 分)(思路+详解+超时解决 兄弟们冲呀呀呀呀呀呀)
- 创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L)
- [SpringSecurity]web权限方案_用户授权_基于权限访问控制_基于角色访问控制_hasAuthority和hasAnyAuthority_hasRole和hasAnyRole
- [JavaWeb-Servlet]Servlet_执行原理
- [Java基础]Math类的常用方法
- LeetCode 530二叉搜索树的最小绝对值差-简单