poj3208 启示录 数位dp
【一句话题意】定义十进制下有3个连续的6的数为魔鬼数。有T个询问,求第k小的魔鬼数。
T<=1000,k<=5e7
【分析】由于K有5e7那么大,哪怕线性dp,常数稍大就会有TLE的风险。如果内存小于128MB又会有MLE的问题显然,预处理出第k大的魔鬼数是不可靠的。
由于T较小,我们转而考虑能否像计数dp一样将先大致预处理出辅助数组,再进行“拼凑”。回答是可行的。但dp数组的定义是与数字的位数有关。
定义f[i,k]表示i位数,开头有k个连续的6的数的数目。注意允许出现前导0
状态转移方程:
f[i,0]=9∗(f[i−1,0]+f[i−1,1]+f[i−1,2]f[i,0]=9*(f[i-1,0]+f[i-1,1]+f[i-1,2]f[i,0]=9∗(f[i−1,0]+f[i−1,1]+f[i−1,2]
f[i,1]=f[i−1,0]f[i,1]=f[i-1,0]f[i,1]=f[i−1,0]
f[i,2]=f[i−1,1]f[i,2]=f[i-1,1]f[i,2]=f[i−1,1]
f[i,3]=f[i−1,2]+f[i−1,3]∗10f[i,3]=f[i-1,2]+f[i-1,3]*10f[i,3]=f[i−1,2]+f[i−1,3]∗10
每次在询问时,利用辅助数组进行转移。
注意设计状态转移方程时,注意不重复不遗漏
【code】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int f[200][4];
void Init(){f[0][0]=1;for(int i=0;i<=20;i++){for(int j=0;j<3;j++){f[i+1][j+1]+=f[i][j];f[i+1][0]+=f[i][j]*9;}f[i+1][3]+=f[i][3]*10;}
}
int main(){int T,n,m;cin>>T;Init();while(T--){scanf("%d",&n);m=3;while(f[m][3]<n)m++;for(int i=m,k=0;i>0;i--){for(int j=0;j<=9;j++){long long cnt=f[i-1][3];if(j==6||k==3)for(int l=max(3-k-(j==6),0);l<3;l++)cnt+=f[i-1][l];if(cnt<n) n-=cnt;else{if(k<3){if(j==6) k++;else k=0;}printf("%d",j);break;}}}cout<<endl;}return 0;
}
poj3208 启示录 数位dp相关推荐
- poj3208启示录——数位DP
题目:http://poj.org/problem?id=3208 数位DP,首先按位数预处理出每一种位数的情况,包括有多少个魔鬼数和有多少个以6开头的非魔鬼数,以便递推.累加等等: 然后先找出第X个 ...
- 数位DP———POJ 3208 启示录
POJ3208 启示录 题目传送门 题目大意:我们称只要某数字的十进制表示中有三个连续的6,我们就称它为"魔鬼数",比如:666,1666,6663,16666 等.现给出一个数X ...
- poj3208 Apocalypse Someday (数位dp + 二分)
The number 666 is considered to be the occult "number of the beast" and is a well used num ...
- 动态规划 —— 数位 DP
[概述] 数位 DP 实际是一种计数用的 DP,一般就是统计一个区间 [le,ri] 内满足一些条件数的个数. 所求的限定条件往往与数的位数有关,例如:数位之和.指定数码个数.数的大小顺序分组等. 题 ...
- bzoj3209 花神的数论题——数位dp
题目大意: 花神的题目是这样的 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你 派(Sum(i)),也就是 sum(1)-sum(N) 的乘积. 要对1000 ...
- 数位dp真·浅谈 By cellur925
预警:由于是从$Vergil$学长那里和$Mathison$大神那里学来的,所以清一色记忆化搜索!qwq 巨佬的数位dp讲解(未来的咕咕日报头条): https://www.luogu.org/blo ...
- 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 2774 Solved: 1230 [Submit ...
- 不要62 ---数位DP
题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...
- bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...
最新文章
- [BZOJ 2756] 奇怪的游戏
- CloudStack4.1.1升级CloudPlatForm4.2.0实践手册
- wc 统计文件的行数
- gmp会屏蔽掉base里的几个函数
- 转 安卓解决 IDEA 下 struts.xml 中 extends=“struts-default“ 报红的问题
- CodeForces - 1610B Kalindrome Array
- Docker部署微服务应用的架构设计
- python打印tensor_如何在TensorFlow中打印SparseTensor内容?
- Oracle_视图_索引_plsql_游标_存储过程_存储函数_触发器
- 数字货币钱包 - 助记词 及 HD 钱包密钥原理
- 洛谷 2184 贪婪大陆
- python批量下载bilibili视频_python批量提取哔哩哔哩bilibili视频
- 双系统蓝牙键盘的共享配对解决办法的简要步骤:win + arch~IRK、LTK、ERand、EDIV
- 苹果手机使用技巧篇:教你完美使用好苹果手机的5个方法
- 开源项目与J2EE架构介绍
- 人工势场算法 Matlab版源码
- php memcached 实例,php memcached mysql开发详细实例
- 【AU】单链表就地逆置
- CEGUI的使用简单说明
- NAND与NOR FLASH的原理与异同