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]+…
Description 666号被认为是神秘的"野兽之数",在所有以启示录为主题的大片中都是一个被广泛使用的数字.但是,这个数字666不能总是在脚本中使用,所以应该使用1666这样的数字.让我们把至少包含三个连续的六位数字的数字称为可怕的数字.头几个可怕的数字是666,1666,2666,3666,4666,5666- 给定一个基于1的索引n,程序应该返回第n个可怕的数字. Input 第一行包含测试用例的数量t(t≤1000). 以下每一个t行包含一个整数n(1≤n≤50000000…
/** 题目:poj3208 Apocalypse Someday 链接:http://poj.org/problem?id=3208 题意:求第K(K <= 5*107)个有连续3个6的数. 思路:数位dp+二分. dp[i][j]表示长度为i,前缀状态为j时含有的个数. j=0表示含有前导0: j=1表示前缀连续1个6 j=2表示前缀连续2个6 j=3表示前缀连续3个6 j=4表示前缀不是6: */ //#include<bits/stdc++.h> #include<cstr…
题意 Language:Default Apocalypse Someday Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 2499 Accepted: 1288 Description The number 666 is considered to be the occult "number of the beast" and is a well used number in all major apocaly…
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…
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…
数位中出现至少3个连续的'6'的数字(称魔鬼数),询问满足要求的排名k的数. 经典题型.采用试填法. 递推做法:预处理出$i$位数字中满足要求的数(下记为'魔鬼数').对每一位都从0到9试一遍,然而卡在了试填时试到6这个数时该怎么办,不太会做.然后才知道可以记录填到目前的上一位已有多少个连续的6,这样可以配合当前的计算出来. 所以就有这个$f[i][0]=9*(f[i-1][0]+f[i-1][1]+f[i-1][2]),f[i][1]=f[i-1][0],f[i][2]=f[i-1][1],f…
数位DP加二分 //数位dp,dfs记忆化搜索 #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long LL; #define N 20 LL dp[N][3];//dp[i][j]表示长度为i,前面有j个6时不含666的数的个数 int num[N]; //c6表示前面6的个数 LL dfs(int len, int c6, bool is…
只要某数字的十进制表示中有三个6相邻,则该数字为魔鬼数,求第X小的魔鬼数\(X\le 5e7\) 这一类题目可以先用DP进行预处理,再基于拼凑思想,用"试填法"求出最终的答案 \(F[i,3]\)表示由 \(i\) 位数字构成的魔鬼数有多少个,\(F[i,j](0\le j\le 2)\) 表示由 \(i\) 位数字构成的,开头已经有连续 \(j\) 个6的非魔鬼数有多少个.(允许前导0的存在,想一想为什么) 转移方程 \(F[i,0] = 9*(F[i-1,0] + F[i-1,1]…
题意: 将含有连续的三个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-…