POJ 3208 Apocalypse Someday
题意:
将含有连续的三个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的更多相关文章
- POJ 3689 Apocalypse Someday [数位DP]
Apocalypse Someday Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 1807 Accepted: 87 ...
- 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
题意 Language:Default Apocalypse Someday Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 2 ...
- 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(二分 数位DP)
数位DP加二分 //数位dp,dfs记忆化搜索 #include<iostream> #include<cstdio> #include<cstring> usin ...
- 【POJ3208】Apocalypse Someday
Description 666号被认为是神秘的"野兽之数",在所有以启示录为主题的大片中都是一个被广泛使用的数字.但是,这个数字666不能总是在脚本中使用,所以应该使用1666这样 ...
- poj3208 Apocalypse Someday[数位DP]
数位中出现至少3个连续的'6'的数字(称魔鬼数),询问满足要求的排名k的数. 经典题型.采用试填法. 递推做法:预处理出$i$位数字中满足要求的数(下记为'魔鬼数').对每一位都从0到9试一遍,然而卡 ...
- POJ-3208 Apocalypse Someday (数位DP)
只要某数字的十进制表示中有三个6相邻,则该数字为魔鬼数,求第X小的魔鬼数\(X\le 5e7\) 这一类题目可以先用DP进行预处理,再基于拼凑思想,用"试填法"求出最终的答案 \( ...
随机推荐
- HashMap深度解析(二)
本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/16890151 上一篇比较深入的分析了HashMap在put元素时的整体过 ...
- VS中监视窗口,即时窗口和输出窗口的使用
一.监视窗口 1.配置应用程序,使应用程序处于调试状态. 2.点击“调试”----“窗口”----“监视”----“监视1”,打开监视窗口. 3.在监视窗口中“名称”栏中输入变量名称或html元素id ...
- 理解pkg-config工具
你在 Unix 或 Linux 下开发过软件吗?写完一个程序,编译运行完全正常,在你本机上工作得好好的,你放到源代码管理系统中.然后,告诉你的同事说,你可以取下来用了.这时,你长长的出了一口气,几天的 ...
- javascript——闭包
<script type="text/javascript"> //什么是闭包: //是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域 ...
- 算法的优化(C语言描述)
算法的优化 算法的优化分为全局优化和局部优化两个层次.全局优化也称为结构优化,主要是从基本控制结构优化.算法.数据结构的选择上考虑:局部优化即为代码优化,包括使用尽量小的数据类型.优化表达式.优化赋值 ...
- 一些javascript免费中文书籍
在这里谢谢那些无私的人~~这些内容来自这里:我只把js的链接粘到这里了~ 还有其它技术文档, 实在是太多了, 多的看都看不完!!! Google JavaScript 代码风格指南 Google JS ...
- CetnOS minimal 网络不可用
系统版本: CentOS-6.6-i386-minimal 问题说明: CentOS minimal 在安装完成之后,网络不可用,一些常见的命令报错,如: ping: unknow host xxxy ...
- 下拉框——把一个select框中选中内容移到另一个select框中遇到的问题
在使用jQuery实现把一个select框中选中内容移到另一个select框中功能时遇到了一个问题,就是点击按钮时内容可以到另一个select框中,但是到了另一个select框中的内容却很快闪退回原来 ...
- sphinx (coreseek)——3、区段查询 与 增量索引实例
首先本文测试数据100多万的域名的wwwtitle 信息 检索数据: 首先建立临时表格: CREATE TABLE `sph_counter` ( `index_id` ) NOT NULL, `m ...
- unix环境高级编程-读书笔记与习题解答-第一篇
从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...