Apocalypse Someday
Time Limit: 1000MS   Memory Limit: 131072K
Total Submissions: 1807   Accepted: 873

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
2
3
187

Sample Output

1666
2666
66666

Source

POJ Monthly--2007.03.04, Ikki, adapted from TCHS SRM 2 ApocalypseSomeday

题意:给定一个数字串A,不含前导0,长为m。m<=9求第P小的包含666的数字 P<=109

课件上是个加强版:

给定一个数字串A,不含前导0,长为m。m<=9
求第P小的包含子串A的数字
P<=109

做法:

二分答案X,转为判断小于等于X的包含子串A的数字有多少个
F[i][j][k][l]表示,填完前i位,KMP指针指向A的第j位,之前是否出现过子串A的状态为k(0/1),下一位能否任意填数的状态为l(0/1),的方案数

这里也可以用类似的做法二分答案

或者可以不二分答案,因为答案是多少位可以判断出来,直接数位DP行了

d[i][0]表示i位数中首位不为6且不含666的数的数量
d[i][1]表示i位数中首位连续1个6并且不含666的数的数量
d[i][2]表示i位数中首位连续2个6并且不含666的数的数量
d[i][3]表示i位数中含有666的数的数量

然后依次从小到大判断每一位填什么行了,记录sum为当前含666的数字的个数,six为当前需要几个6

特判真的好麻烦,于是借鉴 http://blog.csdn.net/keshuai19940722/article/details/41087343 使用g[i][j]表示当前需要i个6,填了数字j后还需要几个6

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int g[][] = {
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , }
};
int d[N][];
void dp(){
d[][]=;
for(int i=;i<=;i++){
d[i][]=(d[i-][]+d[i-][]+d[i-][])*;
d[i][]=d[i-][];
d[i][]=d[i-][];
d[i][]=d[i-][]*+d[i-][];
//printf("d %d %d\n",i,d[i][3]);
}
}
int n;
int main(){
//freopen("in.txt","r",stdin);
dp();
int T=read();
while(T--){
n=read();
int dit=,six=,sum=;
while(d[dit][]<n) dit++;
//printf("dit %d\n",dit);
while(dit){//printf("hidit %d %d\n",dit,sum);
for(int i=;i<=;i++){
int _=;
for(int j=;j>=g[six][i];j--) _+=d[dit-][j];
//printf("_ %d %d %d\n",_,sum,six);
if(sum+_>=n){
printf("%d",i);
six=g[six][i];
break;
}
sum+=_;
}
dit--;
}
putchar('\n');
}
}
 
 

POJ 3689 Apocalypse Someday [数位DP]的更多相关文章

  1. 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的数. ...

  2. poj3208 Apocalypse Someday[数位DP]

    数位中出现至少3个连续的'6'的数字(称魔鬼数),询问满足要求的排名k的数. 经典题型.采用试填法. 递推做法:预处理出$i$位数字中满足要求的数(下记为'魔鬼数').对每一位都从0到9试一遍,然而卡 ...

  3. POJ 3208 Apocalypse Someday

    题意: 将含有连续的三个6的数称为不吉利数,比如666,1666,6662,但是6266吉利.则666为第一个不吉利数,输入整数n,求第n个不吉利数.(n <= 5*10^7) 解法: 如果是给 ...

  4. poj 3252 Round Numbers 数位dp

    题目链接 找一个范围内二进制中0的个数大于等于1的个数的数的数量.基础的数位dp #include<bits/stdc++.h> using namespace std; #define ...

  5. poj 3252 Round Numbers(数位dp 处理前导零)

    Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...

  6. POJ 3252 Round Numbers(数位dp&amp;记忆化搜索)

    题目链接:[kuangbin带你飞]专题十五 数位DP E - Round Numbers 题意 给定区间.求转化为二进制后当中0比1多或相等的数字的个数. 思路 将数字转化为二进制进行数位dp,由于 ...

  7. $POJ$3252 $Round\ Numbers$ 数位$dp$

    正解:数位$dp$ 解题报告: 传送门$w$ 沉迷写博客,,,不想做题,,,$QAQ$口胡一时爽一直口胡一直爽$QAQ$ 先港下题目大意嗷$QwQ$大概就说,给定区间$[l,r]$,求区间内满足二进制 ...

  8. POJ 3208-Apocalypse Someday(数位dp)

    题意:给定n,输出第n大包含666的数字. 分析:dp[i][j][k][l]表示 长度为i,当前位是否是6,前一位是否6,是否已经包含666,表示的数量,再用二分找出第n大的这样的数字. #incl ...

  9. POJ - 3252 - Round Numbers(数位DP)

    链接: https://vjudge.net/problem/POJ-3252 题意: The cows, as you know, have no fingers or thumbs and thu ...

随机推荐

  1. Dora.Interception, 一个为.NET Core度身打造的AOP框架[3]:Interceptor的注册

    在<不一样的Interceptor>中我们着重介绍了Dora.Interception中最为核心的对象Interceptor,以及定义Interceptor类型的一些约定.由于Interc ...

  2. Micropython TPYBoard 智能温控小风扇资料分享

    南方都下大雪了,苦逼的北方还没下雪,天寒地冻,不过这几天办公室空调开太大了就想到做一个温控小风扇,简单模型出来了.等夏天一定做一个美观精致的小风扇送给女朋友(如果有的话QAQ)话不多说直接上干货.(跪 ...

  3. How to bypass Win10 logon password?

    Usually we will use LiveView or VFC to "boot up" the evidence files acquired from suspect' ...

  4. 如何控制input框!

    ENTER键可以让光标移到下一个输入框  只能是中文   屏蔽输入法   只能输入英文和数字   只能是数字 只能显示,不能修改 只能输数字,判断按键的值 function   onlyNum() { ...

  5. Shell常用命令整理

    http://blog.csdn.net/junmail/article/details/4602745 1.   ls: 类似于dos下的dir命令 ls最常用的参数有三个: -a -l -F. l ...

  6. 邓_ Php·笔记本[照片]

    -------------------------------------------------------------------------------------------- [PHP] - ...

  7. main函数的两个参数

    #include "stdio.h" int main(int argc ,char **argv) { printf("argc = %d \n",argc) ...

  8. Spring MVC中使用POI导出Word

    内容绝大部分来源于网络 准备工作 准备[XwpfTUtil]工具类(来源于网络) 准备word模版 下载[XwpfTUtil]工具类 import org.apache.poi.xwpf.usermo ...

  9. 译-what is cmdlet

    A cmdlet (pronounced "command-let") is a lightweight Windows PowerShell script that perfor ...

  10. Part 2:模型与后台管理admin站点--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...