【一句话题意】定义十进制下有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相关推荐

  1. poj3208启示录——数位DP

    题目:http://poj.org/problem?id=3208 数位DP,首先按位数预处理出每一种位数的情况,包括有多少个魔鬼数和有多少个以6开头的非魔鬼数,以便递推.累加等等: 然后先找出第X个 ...

  2. 数位DP———POJ 3208 启示录

    POJ3208 启示录 题目传送门 题目大意:我们称只要某数字的十进制表示中有三个连续的6,我们就称它为"魔鬼数",比如:666,1666,6663,16666 等.现给出一个数X ...

  3. poj3208 Apocalypse Someday (数位dp + 二分)

    The number 666 is considered to be the occult "number of the beast" and is a well used num ...

  4. 动态规划 —— 数位 DP

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

  5. bzoj3209 花神的数论题——数位dp

    题目大意: 花神的题目是这样的 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你 派(Sum(i)),也就是 sum(1)-sum(N) 的乘积. 要对1000 ...

  6. 数位dp真·浅谈 By cellur925

    预警:由于是从$Vergil$学长那里和$Mathison$大神那里学来的,所以清一色记忆化搜索!qwq 巨佬的数位dp讲解(未来的咕咕日报头条): https://www.luogu.org/blo ...

  7. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  8. 不要62 ---数位DP

    题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...

  9. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

最新文章

  1. [BZOJ 2756] 奇怪的游戏
  2. CloudStack4.1.1升级CloudPlatForm4.2.0实践手册
  3. wc 统计文件的行数
  4. gmp会屏蔽掉base里的几个函数
  5. 转 安卓解决 IDEA 下 struts.xml 中 extends=“struts-default“ 报红的问题
  6. CodeForces - 1610B Kalindrome Array
  7. Docker部署微服务应用的架构设计
  8. python打印tensor_如何在TensorFlow中打印SparseTensor内容?
  9. Oracle_视图_索引_plsql_游标_存储过程_存储函数_触发器
  10. 数字货币钱包 - 助记词 及 HD 钱包密钥原理
  11. 洛谷 2184 贪婪大陆
  12. python批量下载bilibili视频_python批量提取哔哩哔哩bilibili视频
  13. 双系统蓝牙键盘的共享配对解决办法的简要步骤:win + arch~IRK、LTK、ERand、EDIV
  14. 苹果手机使用技巧篇:教你完美使用好苹果手机的5个方法
  15. 开源项目与J2EE架构介绍
  16. 人工势场算法 Matlab版源码
  17. php memcached 实例,php memcached mysql开发详细实例
  18. 【AU】单链表就地逆置
  19. CEGUI的使用简单说明
  20. NAND与NOR FLASH的原理与异同

热门文章

  1. RSA PKCS1(google play receipt 验证)
  2. 林轩田机器学习基石入门(三)
  3. Tensorflow执行PB模型问题
  4. [Oracle] 几本重要的电子图书下载
  5. 卷王拼多多的海外现状如何?
  6. 3dmax模型复制卡,为什么?
  7. Cisco 3560 升级IOS
  8. Linux Shell 批量运行语句
  9. 【C语言程序】字符数组输出“I love you”的两种方式
  10. 曾经我们并肩作战,敬未来一杯,敬资本一杯