只要某数字的十进制表示中有三个6相邻,则该数字为魔鬼数,求第X小的魔鬼数\(X\le 5e7\)

这一类题目可以先用DP进行预处理,再基于拼凑思想,用“试填法"求出最终的答案

\(F[i,3]\)表示由 \(i\) 位数字构成的魔鬼数有多少个,\(F[i,j](0\le j\le 2)\) 表示由 \(i\) 位数字构成的,开头已经有连续 \(j\) 个6的非魔鬼数有多少个。(允许前导0的存在,想一想为什么)
转移方程

  1. \(F[i,0] = 9*(F[i-1,0] + F[i-1,1] + F[i-1,2])\)
  2. \(F[i,1] = F[i-1,0]\)
  3. \(F[i,2] = F[i-1,1]\)
  4. \(F[i,3] = F[i-1,2] + 10 * F[i-1,3]\)

然后一位一位的试填,要注意前面填过的数字结尾如果有 k 个6,通过后面拼接 3-k 个6也可以构成魔鬼数

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll f[21][4];
int T,n,l;
void init(){f[0][0] = 1;for(int i=1;i<=20;i++){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][2] = f[i-1][1];f[i][3] = f[i-1][2] + 10 * f[i-1][3];}
}
int main(){init();scanf("%d",&T);while(T--){scanf("%d",&n);//l为答案的长度for(l=3;f[l][3] < n;l++);//k表示填过的数字末尾有k个6for(int i=l,k=0;i;i--){for(int j=0;j<=9;j++){ll cnt = f[i-1][3];//后面预处理出的魔鬼数//找能够拼凑出来的魔鬼数if(j == 6 || k == 3){if(k == 3){for(int x = 0;x < 3;x++)cnt += f[i-1][x];}else{for(int x = max(3-k-1, 0);x<3;x++){cnt += f[i-1][x];}}}if(cnt < n) n -= cnt;else{if(k < 3) j == 6 ? k ++ : k=0;printf("%d",j);break;}}}cout<<endl;}return 0;
}

转载于:https://www.cnblogs.com/1625--H/p/11269361.html

POJ-3208 Apocalypse Someday (数位DP)相关推荐

  1. poj 3208 Apocalypse Someday 数位dp+二分答案

    Apocalypse Someday Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 2203   Accepted: 11 ...

  2. Poj 3208 Apocalypse Someday(数位dp + 二分)

    题目大意:   有三个连续的6在一起的数就是beast数,前几个beast数是:666,1666,2666,-   T组数据,每组询问排名为n的beast的数是什么? 解题思路 第一眼看到懵逼了,不是 ...

  3. poj 3208 Apocalypse Someday(数位dp)

    题意:给定n,输出第n大包含666的数字. 分析:数位dp,详见<算法竞赛进阶指南>P342-344. 代码: #include<iostream> #include<c ...

  4. #数位dp#poj 3208 Apocalypse Someday

    题目 定义一种神奇的数当且仅当数位上至少有3个6,问第n个神奇的数是多少 分析 那么可以预处理出由i位数字构成的魔鬼/非魔鬼数, f[i][0]=9∗(f[i−1][0]+f[i−1][1]+f[i− ...

  5. POJ 3208 Apocalypse Someday

    HyperlinkHyperlinkHyperlink http://poj.org/problem?id=3208 DescriptionDescriptionDescription 定义包含三个连 ...

  6. POJ - 3252 Round Numbers(数位dp)

    题目链接:点击查看 题目大意:规定一个数如果二进制中0的个数大于等于1的个数,则这个数称为"整数",问闭区间a,b中有多少个整数 题目分析:数位dp,dp[pos][c0][c1] ...

  7. 解题报告 (十四) 数位DP

    文章目录 数位DP 解题报告 HDU 4722 Good Numbers HDU 2089 不要62 HDU 3555 Bomb HDU 3652 B-number PKU 3252 Round Nu ...

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

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

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

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

  10. POJ 3252 数位DP

    链接: http://poj.org/problem?id=3252 题意: 给你一个区间l,r,求区间中有多少个数转化为二进制后1的个数大于等于0的个数 题解: 还是数位dp,不过多了前导0的判断 ...

最新文章

  1. 北斗导航 | NB-IoT——了解什么是NB-IoT,与短报文有什么关系
  2. java多线程必杀技_Java技术大牛必备25个必杀技你都知道吗
  3. mysql tungsten_使用tungsten将mysql的数据同步到hadoop
  4. springboot oauth 鉴权之——password、authorization_code鉴权
  5. 行为型设计模式(2)—— 模板方法模式(Template Method Pattern)
  6. 利用Easy-Rules实现动态业务规则
  7. 精选32个最新Python实战项目(附源码),拿走就用
  8. 【机器视觉】独家盘点:详解国内外34家物联网机器视觉技术企业
  9. 里恩药物警戒系统(RH-PV)介绍
  10. 随机出题 php,asp.net/net/c#随机出题在线考试系统
  11. 写完APDL命令流之后,如何运行TXT文件,直接生成k文件
  12. js怎么实现ftp上传文件到服务器,js ftp上传文件到服务器上
  13. 计算机制图孔中心线,机械制图中各种中心线绘制方法.docx
  14. 【合作伙伴大练兵-安全】NGFW盒式防火墙问题排查和维护
  15. 计算机相关知识——阻塞和非阻塞,同步和异步等相关概念
  16. hdu6441 Find Integer
  17. PP实施经验分享(24)——ECN应用及系统操作
  18. CheatMaker教学进阶之一 - 基地址与指针
  19. 小米机器人虚拟墙设置_扫地机器人虚拟墙介绍及怎样设置
  20. 5个酷毙的 Python 神器工具

热门文章

  1. 20189221 2018-2019-2 《密码与安全新技术专题》第四周作业
  2. 微信小程序阻止事件冒泡
  3. vistor虚拟磁带库+be2010安装
  4. 不接受 996 就不可思议了?
  5. 星软车联显示服务器未返回gps,营口GPS——星软GPS车辆监控系统功能(一)
  6. 安卓10 linux内核,AndroidQ(10.0) 内核版本增加linux编译用户信息
  7. 网络空间安全概论 第二章 作业
  8. windows10系统如何关闭数字签名认证
  9. 视频教程-Access2013数据库入门教程3查询部分-MySQL
  10. IDEA开发工具调试技巧(极大提升开发效率)