POJ3208魔鬼数】的更多相关文章

题目:http://poj.org/problem?id=3208 与一般的数位dp有点不同的是,没有给出上界,而是要通过值来判断这一位该填什么. 当然是从高位向低位填. 为了知道这一位填下去对答案有什么影响,需要预处理出后面无限制的魔鬼数个数. 预处理魔鬼数最重要的是不重不漏.这一位的魔鬼数=上一位的所有魔鬼数+这一位填6带来的新魔鬼数. 新魔鬼数不能与上一位已有的魔鬼数重复,所以需要记录“开头有2个6的非魔鬼数”. 为了得到这个,递推需要记录“开头有1个6的非魔鬼数”和“开头有0个6的非魔鬼…
题意 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…
题目:http://poj.org/problem?id=3208 数位DP,首先按位数预处理出每一种位数的情况,包括有多少个魔鬼数和有多少个以6开头的非魔鬼数,以便递推.累加等等: 然后先找出第X个魔鬼数的位数,再一位一位从0开始填数: 写法有些技巧,详见代码及注释. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; ][]; void cl() { /*…
数位中出现至少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…
Poj  AcWing Description Sol  这题长得就比较像数位$DP$叭. 所以先用$DP$进行预处理,再基于拼凑思想,通过"试填法"求出最终的答案. 设$F[i][3]$表示由$i$位数字构成的魔鬼数有多少个,$F[i][j](0<=j<=2)$表示由$i$位数字组成的,开头有$j$个$6$的非魔鬼数有多少个.注意,在计算$F[i][j]$时允许前导$0$的存在 $F[i][0]=9*(F[i-1][0]+F[i-1][1]+F[i-1][2])$ $F[…
只要某数字的十进制表示中有三个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]…
怎么说,数位DP还是我的噩梦啊,细节太恐怖了. 但是这章感觉又和之前的学的数位DP有差异?(应该是用DP预处理降低时间复杂度,好劲啊,不过以前都是记忆化搜索的应该不会差多少) poj3208 f[i][0~2]表示第i位,开头连续j个6的情况数,[3]表示魔鬼数的个数,这样可以方便得出区间内有多少魔鬼数,不停的试填到底即可. #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib…
1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认识这个宏了:也可以把任何东西定义成宏.因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮忙. 看例子: #define PI 3.141592654 在此后的代码中你尽可以使用PI 来代替3.141592654,而且你最好就这么做.不然的话,如果我要把PI 的精度再提高…
1.数值宏常量     #define宏定义是个演技非常高超的替身演员,但也会耍大牌的,所以我们使用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码都认识宏了:也可以把任何东西都定义成宏.因为编译器会在预编译的时候用真身替换替身,所以在我们的代码里可以常常用替身来帮忙.     #define  PI     3.1415926    在此后的代码中,你尽可能的使用PI来代替3.1415926,而且最好就这么做.不然的话,如果我们精度再提高一点怎么办?如果用PI的话,我们就…
http://poj.org/problem?id=3208 一个魔鬼数为包含连续三个666的的数字,给个n(n<5e7)求第n个魔鬼数. 预处理f[i][j],f[i][3]表示由前i位数字构成所有可能的魔鬼数,需要注意这里允许前导0存在. f[i][2]表示由i位数字构成的开头为2个6的非魔鬼数个数, f[i][1]表示由i位数字构成的开头为1个6的非魔鬼数个数, f[i][1]表示由i位数字构成的开头为0个6的非魔鬼数个数, 之后从高位到低位填每个数,每个数从小到大枚举. #include…