Apocalypse Someday

定义一个数是合法的,当且仅当中间出现至少一个连续的大于三个的6,求第x个合法的数,\(x\leq 50,000,000\)

首先,注意到求第几个,即想到试填法,而试填法关键在于确定了这个状态下的方案数,记住这个,接下来就很好理解了。

显然要表现长度,又因为要表现合法,于是设\(f[i][j]\)表示有i位的数,状态为j(0表示最高位没有6,1有1个6,2表示有连续的两个6的不合法的数,3表示这是一个合法的数)的方案数,因此不难有

\[f[i][0]=(f[i-1][0]+f[i-1][1]+f[i-1][2])\times 9
\]

\[f[i][1]=f[i-1][0],f[i][2]=f[i-1][1],f[i][3]=10\times f[i-1][3]+f[i-1][2]
\]

边界:\(f[0][0]=1\)

于是我们可以以此从高位到低位进行试填,数字从小到大,注意特判6,比如填到第i位,此处填了一个6,前面有2个连续的6紧挨着第i位,于是不但\(f[i-1][3]\)为合法的方案,还有\(f[i-1][1]+f[i-1][2]\),同理可推出前面有1个6,注意前面3个6时,不管这里填什么,方案都是\(f[i-1][0]+f[i-1][1]+f[i-1][2]+f[i-1][3]\)

#include <iostream>
#include <cstdio>
#define il inline
#define ri register
#define int long long
using namespace std;
int dp[21][4];
il int max(int,int);
il void read(int&),prepare();
main(){
int lsy;read(lsy),prepare();
while(lsy--){
int x;read(x);
int w(0),i,j,t6(0),cnt;
while(dp[w][3]<x)++w;
while(w){
for(i=0;i<10;++i){
cnt=dp[w-1][3];
if(i==6||t6>2)
for(j=max(2-t6,0);j<3;++j)
cnt+=dp[w-1][j];
if(cnt>=x){putchar(i+48);break;}
else x-=cnt;
}if(i==6)++t6;else if(t6<3)t6&=0;--w;
}putchar('\n');
}
return 0;
}
il int max(int a,int b){
return a>b?a:b;
}
il void prepare(){
dp[0][0]=1;
for(int i(1);i<=20;++i)
dp[i][1]=dp[i-1][0],dp[i][2]=dp[i-1][1],dp[i][3]=10*dp[i-1][3]+dp[i-1][2],
dp[i][0]=(dp[i-1][0]+dp[i-1][1]+dp[i-1][2])*9;
}
il void read(int &x){
x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

Apocalypse Someday的更多相关文章

  1. POJ 3689 Apocalypse Someday [数位DP]

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

  2. POJ3208 Apocalypse Someday

    题意 Language:Default Apocalypse Someday Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 2 ...

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

  4. POJ3208:Apocalypse Someday

    传送门 很神奇的一道题,正解是AC自动机+数位DP,个人感觉POPOQQQ大爷的方法更方便理解. 按照一般套路,先搞个DP预处理,设$f[i][0/1/2/3]$分别表示对于$i$位数,其中有多少个前 ...

  5. POJ3208 Apocalypse Someday(二分 数位DP)

    数位DP加二分 //数位dp,dfs记忆化搜索 #include<iostream> #include<cstdio> #include<cstring> usin ...

  6. POJ 3208 Apocalypse Someday

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

  7. 【POJ3208】Apocalypse Someday

    Description 666号被认为是神秘的"野兽之数",在所有以启示录为主题的大片中都是一个被广泛使用的数字.但是,这个数字666不能总是在脚本中使用,所以应该使用1666这样 ...

  8. poj3208 Apocalypse Someday[数位DP]

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

  9. POJ-3208 Apocalypse Someday (数位DP)

    只要某数字的十进制表示中有三个6相邻,则该数字为魔鬼数,求第X小的魔鬼数\(X\le 5e7\) 这一类题目可以先用DP进行预处理,再基于拼凑思想,用"试填法"求出最终的答案 \( ...

随机推荐

  1. 新学MyBatis

    今天学习了Mybatis入门,将知识归纳一下: 创建一个java项目之后,想使用myBatis需要完成一下几个步骤: 1.先导jar包 2.写model文件 () 3.写全局配置文件 SqlMapCo ...

  2. lua redis 操作

    https://redis.io/commands/keys 遍历redis里面的所有key ,还能进行模糊匹配, 这样就省去了对key的手动过滤了 比如 keys term_info* ) &quo ...

  3. js循环给li绑定事件实现和弹出对应的索引

    原文:http://www.cnblogs.com/wuchuanlong/p/5945286.html 方法一,动态添加click事件,并添加属性 var itemli = document.get ...

  4. Download Kali Linux

    https://www.kali.org/downloads/

  5. composer(作曲家)安装php-ml

    刚开始我用的是up5.6版本php命令安装composer 后来使用composer时发现命令行会提示php版本太低 于是我下载了wamp,使用7.1版本的php重新安装了composer,因为php ...

  6. bcc-tools工具之profile

    profile是用于追踪程序执行调用流程的工具,类似于perf中的-g指令 相比perf -g而言,profile功能化更加细分,可以根据需要选择追踪层面,例如-U(用户要调用流程) -K (内核态调 ...

  7. usb基础知识以及枚举过程介绍

    一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符:而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符:在接口描述符里面又定 ...

  8. APIO 2007 风铃

    题目描述 你准备给弟弟 Ike 买一件礼物,但是,Ike 挑选礼物的方式很特别:他只喜欢那些能被他排成有序形状的东西. 你准备给 Ike 买一个风铃.风铃是一种多层的装饰品,一般挂在天花板上. 每个风 ...

  9. NX二次开发-UFUN相加布尔操作,可保留或删除目标体,工具体UF_MODL_unite_bodies_with_retained_options

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建块 UF_FEATURE_SIGN ...

  10. php 类静态变量 和 常量消耗内存及时间对比

    在对类执行100w次循环后, 常量最快,变量其次,静态变量消耗时间最高 其中: 常量消耗:101.1739毫秒 变量消耗:2039.7689毫秒 静态变量消耗:4084.8911毫秒 测试代码: cl ...