题意:

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

解法:

   如果是给出n,求n以内的不吉利数有多少个,就是一个普通的数位DP。所以,就二分答案,对于每一个mid,求一下小于等于mid的数中不吉利数的个数。

tag:二分法,数位DP

 /*
* Author: Plumrain
* Created Time: 2013-12-14 20:55
* File Name: DP-POJ-3208.cpp
*/
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; #define CLR(x) memset(x, 0, sizeof(x))
typedef long long int64;
int64 d1[][][], d2[][][]; int64 get_num(int64 x)
{
int len = , dit[];
bool xxx = ;
while (x){
dit[len++] = x % ;
x /= ;
if (len > && dit[len-] == && dit[len-] == && dit[len-] == )
xxx = ;
}
dit[len] = ; dit[len+] = ; int64 ret = ;
if (xxx) ret = ;
bool flag = ;
for (int i = len-; i >= ; -- i){
for (int j = ; j < ; ++ j)
for (int k = ; k < ; ++ k)
ret += dit[i] * d2[i][j][k]; if (flag){
for (int j = ; j < ; ++ j)
for (int k = ; k < ; ++ k)
ret += dit[i] * d1[i][j][k];
}
else {
if (dit[i+] == && dit[i+] == && dit[i] > ){
for (int j = ; j < ; ++ j)
for (int k = ; k < ; ++ k)
ret += d1[i][j][k];
}
else if (dit[i+] == && dit[i] > ){
for (int j = ; j < ; ++ j)
ret += d1[i][][j];
}
else if (dit[i] > ) ret += d1[i][][];
} if (dit[i] == && dit[i+] == && dit[i+] == )
flag = ;
}
return ret;
} int64 gao(int64 n)
{
int64 l = , r = ;
while (l <= r){
int64 mid = (l + r) >> ;
if (get_num(mid) < n) l = mid + ;
else r = mid - ;
}
return l;
} int main()
{
CLR (d1); CLR (d2);
d1[][][] = ;
for (int i = ; i < ; ++ i){
d1[][i][] = ;
for (int j = ; j < ; ++ j)
d1[][i][j] = ;
} for (int i = ; i < ; ++ i){
d2[i][][] += d1[i-][][];
d1[i][][] -= d1[i-][][];
for (int j = ; j < ; ++ j)
for (int k = ; k < ; ++ k)
for (int l = ; l < ; ++ l){
d2[i][j][k] += d2[i-][k][l];
d1[i][j][k] += d1[i-][k][l];
}
} int T;
scanf ("%d", &T);
while (T--){
int64 n;
cin >> n;
cout << gao(n) << endl;
}
return ;
}

POJ 3208 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 数位dp+二分 求第K(K <= 5*107)个有连续3个6的数。

    /** 题目:poj3208 Apocalypse Someday 链接:http://poj.org/problem?id=3208 题意:求第K(K <= 5*107)个有连续3个6的数. ...

  3. POJ3208 Apocalypse Someday

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

  4. Apocalypse Someday

    Apocalypse Someday 定义一个数是合法的,当且仅当中间出现至少一个连续的大于三个的6,求第x个合法的数,\(x\leq 50,000,000\) 解 首先,注意到求第几个,即想到试填法 ...

  5. POJ3208:Apocalypse Someday

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

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

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

  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. 设置ORACLE环境变量

    sqlplus 执行不了可能原因是未设置环境变量,设置方法:  export ORACLE_HOME=/usr/local/instantclient_11_2

  2. NSString 的三种截取方法

    1.定义一个字符串a, 截取a 的某一个项目组,复制给b, b必须是int型 NSString *a = @"1.2.30"; int  b= [[a substringWithR ...

  3. Codeforces 543B Destroying Roads(最短路)

    题意: 给定一个n个点(n<=3000)所有边长为1的图,求最多可以删掉多少条边后,图满足s1到t1的距离小于l1,s2到t2的距离小于l2. Solution: 首先可以分两种情况讨论: 1: ...

  4. phpstorm IDE编辑器使用手记

    a.选项卡限制问题 突破打开的文件选项卡个数限制:默认安装后的phpstorm打开的文件个数是有限制的,默认是10个.也就是最多同时打开10个文件进行编辑. 超过10个就会自动关闭前面最先打开的文件. ...

  5. YII 自动引入juquery进行表单验证

    在form表单 里面引入这么一句话 array(      'enableClientValidation'=>true,    'clientOptions'=>array(       ...

  6. 安卓AVD使用建议

    问题描述:之前在安装了Android开发环境后,一开始并没有直接在Android手机和平板上进行调试,是使用的AVD模拟器工具.由于电脑的配置不是特别好,总感觉AVD的使用速度太慢,包括启动的时候还有 ...

  7. Python开发【第一章】:Python简介和入门

    Python简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承. ...

  8. python的min()函数也可用于比较tuple

      python的min()函数也可用于比较tuple >>> a = (2,'asv','dfg') >>> b = (3,'gsg','weg') >&g ...

  9. oracle常见为题汇总,以及一个简单数据连接操作工厂

    本人软件环境:win8.1 64位操作系统,vs2013,安装好了与oracle数据库对应的客户端         连接oracle数据库.以及操作数据库 1.使用IIS建立网站,浏览网页时候,提示“ ...

  10. 递归删除.DS_Store文件

    删除svn文件 sudo find . -name ".DS_Store" -exec rm -r {} \; sudo find . -name ".git" ...