POJ3208:Apocalypse Someday
很神奇的一道题,正解是AC自动机+数位DP,个人感觉POPOQQQ大爷的方法更方便理解。
按照一般套路,先搞个DP预处理,设$f[i][0/1/2/3]$分别表示对于$i$位数,其中有多少个前0/1/2位为6的个数和整体中包含666的个数。那么就很容易得到以下转移方程。
$f[i][3]=f[i-1][3] \times 10+f[i-1][2]$
$f[i][2]=f[i-1][1]$
$f[i][1]=f[i-1][0]$
$f[i][0]=(f[i-1][0]+f[i-1][1]+f[i-1][2]) \times 9$
剩下的就比较麻烦了。
刚开始我想的是不断剔除排名从而确定每一位上的数。但是这个是很麻烦的,而且不好处理。更换一种方案就是通过二分确定这个排名的个数,只要我们能验证小于$N$的数中有多少个满足要求的数。
这个求的过程相当玄学...我也说不上来QAQ
//NOIp DP apo //by Cydiater //2016.10.4 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <ctime> #include <iomanip> #include <cmath> using namespace std; #define ll long long #define up(i,j,n) for(ll i=j;i<=n;i++) #define down(i,j,n) for(ll i=j;i>=n;i--) #define FILE "apo" const ll MAXN=1e6+5; const ll oo=0x3f3f3f3f; const ll mod=(1<<31)-1; inline ll read(){ char ch=getchar();ll x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } ll f[25][10],leftt,rightt,mid,T; namespace solution{ void pret(){ memset(f,0,sizeof(f)); f[0][0]=1; up(i,1,21){ f[i][3]=f[i-1][3]*10+f[i-1][2]; f[i][2]=f[i-1][1]; f[i][1]=f[i-1][0]; f[i][0]=(f[i-1][0]+f[i-1][1]+f[i-1][2])*9; } } ll check(ll num){ ll di=0,far=1,tmp=0,cnt=0,ans=0; for(;far<num;far*=10,di++); while(tmp<num){ ll re_cnt; while(tmp+far<=num){ tmp+=far; if(cnt==3) re_cnt=3; else if((tmp/far)%10==7) re_cnt=cnt+1; else re_cnt=0; down(i,3,3-re_cnt)ans+=f[di][i]; } if(cnt!=3)cnt=((tmp/far)%10==6?cnt+1:0); di--;far/=10; } return ans; } ll slove(ll N){ leftt=1;rightt=100000000000000000LL; N--; while(leftt+1<rightt){ mid=(leftt+rightt)>>1; ll tmp=check(mid); if(tmp>N) rightt=mid; else leftt=mid; } if(check(leftt)==N) return leftt; return rightt; } } int main(){ freopen(FILE".in","r",stdin); //freopen(FILE".out","w",stdout); using namespace solution; pret(); T=read(); while(T--)cout<<slove(read())<<endl; return 0; }
POJ3208:Apocalypse Someday的更多相关文章
- 【POJ3208】Apocalypse Someday
Description 666号被认为是神秘的"野兽之数",在所有以启示录为主题的大片中都是一个被广泛使用的数字.但是,这个数字666不能总是在脚本中使用,所以应该使用1666这样 ...
- 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 ...
- 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[数位DP]
数位中出现至少3个连续的'6'的数字(称魔鬼数),询问满足要求的排名k的数. 经典题型.采用试填法. 递推做法:预处理出$i$位数字中满足要求的数(下记为'魔鬼数').对每一位都从0到9试一遍,然而卡 ...
- POJ3208 Apocalypse Someday(二分 数位DP)
数位DP加二分 //数位dp,dfs记忆化搜索 #include<iostream> #include<cstdio> #include<cstring> usin ...
- POJ-3208 Apocalypse Someday (数位DP)
只要某数字的十进制表示中有三个6相邻,则该数字为魔鬼数,求第X小的魔鬼数\(X\le 5e7\) 这一类题目可以先用DP进行预处理,再基于拼凑思想,用"试填法"求出最终的答案 \( ...
- POJ 3208 Apocalypse Someday
题意: 将含有连续的三个6的数称为不吉利数,比如666,1666,6662,但是6266吉利.则666为第一个不吉利数,输入整数n,求第n个不吉利数.(n <= 5*10^7) 解法: 如果是给 ...
随机推荐
- IDEA【 MyBatis Plugin】 插件免费完美运行
mybatis_plus.jar 包 .Install plugin from disk...导入即能用. BaiDu云: 链接: http://pan.baidu.com/s/1geKtTbP 密码 ...
- wap端开发必须基础
1. nitial-scale=1.0 确保网页加载时,以 1:1 的比例呈现,不会有任何的缩放. 在移动设备浏览器上,通过为 viewport meta 标签添加 user-scalable=no ...
- C语言strcat()函数:连接字符串
头文件:#include <string.h> strcat() 函数用来连接字符串,其原型为: char *strcat(char *dest, const char *src); ...
- MATLAB实现频数直方图——hist的使用
"hist" is short for "Histogram(直方图.柱状图)". 1.N = hist(Y) bins the elements of Y ...
- Android怎么使用字体图标 自定义FontTextView字体图标控件-- 使用方法
首先我想说明一下字体图标的好处,最大的好处就是自适应了,而且是使用TextView 不用去切图,是矢量图 灵活调用 第一步我要说明一下一般字体图标的来源,我这里使用的是 --阿里巴巴矢量图标库 -网 ...
- git 删除和重命名文件
1. 删除文件 git rm a.txt git rm--cached filename 会删除索引中的文件并把它保留在工作目录中 而 git rm 则会将文件从索引和工作目录中都删除 文件删除后的恢 ...
- Web前端性能优化教程09:图像和Cookie优化
本文是Web前端性能优化系列文章中的第九篇,主要讲述内容:图像和Cookie优化.完整教程可查看: 一. 图像优化 图像基础知识 gif: 适用于动画效果,例如提示的滚动条图案 jpg: 是一种使用 ...
- JAVA中AJAX的使用
AJAX<%@ page language="java" import="java.util.*" pageEncoding="UTF-8&qu ...
- bzoj3998: [TJOI2015]弦论
SAM小裸题qwq #include <iostream> #include <cstdio> #include <cmath> #include <cstr ...
- Python3 连接Mysql
代码: #!/usr/bin/env python # encoding: utf-8 """ @author: 侠之大者kamil @file: mysql_test. ...