POJ3208 Apocalypse Someday
题意
|
Language:Default
Apocalypse Someday
Description The number 666 is considered to be the occult “number of the beast” and is a well used number in all major apocalypse themed blockbuster movies. However the number 666 can’t always be used in the script so numbers such as 1666 are used instead. Let us call the numbers containing at least three contiguous sixes beastly numbers. The first few beastly numbers are 666, 1666, 2666, 3666, 4666, 5666… Given a 1-based index n, your program should return the nth beastly number. Input The first line contains the number of test cases T (T ≤ 1,000). Each of the following T lines contains an integer n (1 ≤ n ≤ 50,000,000) as a test case. Output For each test case, your program should output the nth beastly number. Sample Input 3 Sample Output 1666 Source POJ Monthly--2007.03.04, Ikki, adapted from TCHS SRM 2 ApocalypseSomeday
|
定义十进制下有3个连续的6的数为魔鬼数。有T个询问,求第k小的魔鬼数。
T<=1000,k<=5e7
分析
参照xyc1719的题解。
由于K有5e7那么大,哪怕线性dp,常数稍大就会有TLE的风险。如果内存小于128MB又会有MLE的问题显然,预处理出第k大的魔鬼数是不可靠的。
由于T较小,我们转而考虑能否像计数dp一样将先大致预处理出辅助数组,再进行“拼凑”。回答是可行的。但dp数组的定义是与数字的位数有关。
定义\(f[i,k]\)表示\(i\)位数,开头有\(k\)个连续的6的数的数目。注意允许出现前导0
状态转移方程:
f[i,1]=f[i−1,0]\\
f[i,2]=f[i−1,1]\\
f[i,3]=f[i−1,2]+f[i−1,3]∗10
\]
每次在询问时,利用辅助数组进行转移。
注意设计状态转移方程时,注意不重复不遗漏
时间复杂度\(O(\log ans)\)
代码
#include<iostream>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
ll f[21][4];
void prework(){
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 n,m;
int main(){
prework();
for(int t=read<int>();t--;){
read(n);
for(m=3;f[m][3]<n;++m);
for(int i=m,k=0;i;--i){
for(int j=0;j<=9;++j){
ll cnt=f[i-1][3];
if(j==6||k==3)
for(int l=std::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;
}
}
}
puts("");
}
return 0;
}
POJ3208 Apocalypse Someday的更多相关文章
- poj3208 Apocalypse Someday 数位dp+二分 求第K(K <= 5*107)个有连续3个6的数。
/** 题目:poj3208 Apocalypse Someday 链接:http://poj.org/problem?id=3208 题意:求第K(K <= 5*107)个有连续3个6的数. ...
- POJ3208 Apocalypse Someday(二分 数位DP)
数位DP加二分 //数位dp,dfs记忆化搜索 #include<iostream> #include<cstdio> #include<cstring> usin ...
- poj3208 Apocalypse Someday[数位DP]
数位中出现至少3个连续的'6'的数字(称魔鬼数),询问满足要求的排名k的数. 经典题型.采用试填法. 递推做法:预处理出$i$位数字中满足要求的数(下记为'魔鬼数').对每一位都从0到9试一遍,然而卡 ...
- POJ-3208 Apocalypse Someday (数位DP)
只要某数字的十进制表示中有三个6相邻,则该数字为魔鬼数,求第X小的魔鬼数\(X\le 5e7\) 这一类题目可以先用DP进行预处理,再基于拼凑思想,用"试填法"求出最终的答案 \( ...
- POJ 3689 Apocalypse Someday [数位DP]
Apocalypse Someday Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 1807 Accepted: 87 ...
- Apocalypse Someday
Apocalypse Someday 定义一个数是合法的,当且仅当中间出现至少一个连续的大于三个的6,求第x个合法的数,\(x\leq 50,000,000\) 解 首先,注意到求第几个,即想到试填法 ...
- POJ3208:Apocalypse Someday
传送门 很神奇的一道题,正解是AC自动机+数位DP,个人感觉POPOQQQ大爷的方法更方便理解. 按照一般套路,先搞个DP预处理,设$f[i][0/1/2/3]$分别表示对于$i$位数,其中有多少个前 ...
- 【POJ3208】Apocalypse Someday
Description 666号被认为是神秘的"野兽之数",在所有以启示录为主题的大片中都是一个被广泛使用的数字.但是,这个数字666不能总是在脚本中使用,所以应该使用1666这样 ...
- POJ 3208 Apocalypse Someday
题意: 将含有连续的三个6的数称为不吉利数,比如666,1666,6662,但是6266吉利.则666为第一个不吉利数,输入整数n,求第n个不吉利数.(n <= 5*10^7) 解法: 如果是给 ...
随机推荐
- Python之set方法
class set(object): """ set() -> new empty set object set(iterable) -> new set o ...
- c++ 指针与const的三种组合
三种形式 const int a=1; int b=2: 1 const int * ptr1=&a; 2 int * const ptr2 = b; 3 const int * const ...
- web应用及web.xml
一.创建web应用 1.在任意目录新建webDemo文件夹 2.在webDemo下新建WEB-INF文件夹(注意大小写) 3.在WEB-INF中新建web.xml文件(可以copy已有的web应用中的 ...
- flask记录
flask文件上传 flask 文件上传 https://www.cnblogs.com/wongbingming/p/6802660.html flask多文件上传:https://blog.cs ...
- 20175224 2018-2019-2 《Java程序设计》第三周学习总结
教材学习内容总结 编程语言发展的几个阶段 面向机器语言 面向过程语言 面向对象语言 封装性 继承性 多态性 类 类是Java程序的基本要素,一个Java应用程序就是由若干个类所构成的. 类是Java语 ...
- Vue语法学习第二课——指令
指令,是指在Vue中,带有-v前缀的特殊特性 指令特性的值预期是单个JavaScript表达式(v-for例外) <p v-if="seen">看得到</p> ...
- 20165214 2018-2019-2 《网络对抗技术》Exp2 后门原理与实践 Week4
<网络对抗技术>Exp2 PC平台逆向破解之"MAL_简单后门" Week4 一.实验内容 本次实验对象为名为pwn1的pwn1的linux可执行文件.程序正常执行流程 ...
- 使goroutine同步的方法总结
前言: 在前面并发性能对比的文章中,我们可以看到Golang处理大并发的能力十分强劲,而且开发也特别方便,只需要用go关键字即可开启一个新的协程. 但当多个goroutine同时进行处理的时候,就会遇 ...
- Java学习笔记(6)
superclass(base class)和subclass 扩展一个类的语法 public class subClassName extends superClassName 子类中通过super ...
- Linux 驱动——Button驱动1
button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/i ...