1. /**
  2. 题目:poj3208 Apocalypse Someday
  3. 链接:http://poj.org/problem?id=3208
  4. 题意:求第K(K <= 5*107)个有连续3个6的数。
  5. 思路:数位dp+二分。
  6. dp[i][j]表示长度为i,前缀状态为j时含有的个数。
  7. j=0表示含有前导0;
  8. j=1表示前缀连续1个6
  9. j=2表示前缀连续2个6
  10. j=3表示前缀连续3个6
  11. j=4表示前缀不是6;
  12.  
  13. */
  14.  
  15. //#include<bits/stdc++.h>
  16. #include<cstring>
  17. #include<cstdio>
  18. #include<iostream>
  19. #include<map>
  20. #include<algorithm>
  21. #include<queue>
  22. using namespace std;
  23. #define P pair<int,int>
  24. #define ms(x,y) memset(x,y,sizeof x)
  25. #define LL long long
  26. const int maxn = ;
  27. const int mod = 1e9+;
  28. const int maxnode = *+;
  29. const int sigma_size = ;
  30. const LL inf = 1e18;
  31. int digit[];
  32. LL dp[][];///0表示前导0,1表示前缀一个6,2表示前缀2个6,3表示前缀3个6,4表示前缀不是6;
  33. int next_state(int state,int x)
  34. {
  35. if(state==) return ;
  36. if(x==){
  37. if(state==||state==) return state+;
  38. else return ;
  39. }else
  40. {
  41. return ;
  42. }
  43. }
  44. LL dfs(int len,int state,int bounded)
  45. {
  46. if(len==){
  47. return state==;
  48. }
  49. if(!bounded&&dp[len][state]!=-) return dp[len][state];
  50. int d = bounded?digit[len]:;
  51. LL ans = ;
  52. for(int i = ; i <= d; i++){
  53. if(state==){
  54. if(i==) ans += dfs(len-,,bounded&&(i==d));
  55. else ans += dfs(len-,i==?:,bounded&&(i==d));
  56. }else
  57. {
  58. ans += dfs(len-,next_state(state,i),bounded&&(i==d));
  59. }
  60. }
  61. if(!bounded){
  62. dp[len][state] = ans;
  63. }
  64. return ans;
  65. }
  66. LL solve(LL n)
  67. {
  68. int len = ;
  69. while(n){
  70. digit[++len] = n%;
  71. n /= ;
  72. }
  73. return dfs(len,,true);
  74. }
  75. int main()
  76. {
  77. int T;
  78. ms(dp,-);
  79. cin>>T;
  80. while(T--)
  81. {
  82. int n;
  83. scanf("%d",&n);
  84. LL lo = , hi = inf, mi;
  85. while(lo<hi){
  86. mi = (lo+hi)/;
  87. LL ans = solve(mi);
  88. if(ans>=n){///找下界。
  89. hi = mi;
  90. }else
  91. {
  92. lo = mi+;
  93. }
  94. }
  95. printf("%lld\n",hi);
  96. }
  97. return ;
  98. }
  99.  
  100. /*
  101.  
  102. */

poj3208 Apocalypse Someday 数位dp+二分 求第K(K <= 5*107)个有连续3个6的数。的更多相关文章

  1. poj3208 Apocalypse Someday[数位DP]

    数位中出现至少3个连续的'6'的数字(称魔鬼数),询问满足要求的排名k的数. 经典题型.采用试填法. 递推做法:预处理出$i$位数字中满足要求的数(下记为'魔鬼数').对每一位都从0到9试一遍,然而卡 ...

  2. POJ 3689 Apocalypse Someday [数位DP]

    Apocalypse Someday Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 1807   Accepted: 87 ...

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

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

  4. POJ-3208 Apocalypse Someday (数位DP)

    只要某数字的十进制表示中有三个6相邻,则该数字为魔鬼数,求第X小的魔鬼数\(X\le 5e7\) 这一类题目可以先用DP进行预处理,再基于拼凑思想,用"试填法"求出最终的答案 \( ...

  5. POJ3208 Apocalypse Someday

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

  6. UPC 2223: A-Number and B-Number(数位DP+二分)

    积累点: 1: (l&r)+((l^r)>>) == (l+r)/2 2: 注意判断现在是否有限制.当枚举下一个量时,是(isQuery && j==end),不要 ...

  7. hihocoder #1301 : 筑地市场 数位dp+二分

    题目链接: http://hihocoder.com/problemset/problem/1301?sid=804672 题解: 二分答案,每次判断用数位dp做. #include<iostr ...

  8. 数位dp(求1-n中数字1出现的个数)

    题意:求1-n的n个数字中1出现的个数. 解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不能够任意取,true为没降,true为 ...

  9. CodeChef FAVNUM FavouriteNumbers(AC自动机+数位dp+二分答案)

    All submissions for this problem are available. Chef likes numbers and number theory, we all know th ...

随机推荐

  1. 推荐系统之 BPR 算法及 Librec的BPR算法实现【1】

    [推荐系统之 BPR 算法] 1.关于BPR的论文原文: BPR: Bayesian Personalized Ranking from Implicit Feedback 2.参考1:论文快读 - ...

  2. Android-----完全隐藏软键盘

    隐藏软键盘一直是我头痛的事情,没有找到一种真正能隐藏的方法.点击EditText的时候总是弹出软键盘.-----杯具 杯具(一): InputMethodManager im =(InputMetho ...

  3. Android之SurfaceView使用总结

    1.概念SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图.它的特性是:可以在主线程之外的线程中向屏幕绘图上.这样可以避免画图任务繁重的时 ...

  4. 利用腾讯云免费证书打造全https站

    什么是https? 超文本传输安全协议(Hypertext Transfer Protocol Secure,缩写为HTTPS)是一种网络安全传输协议http是HTTP协议运行在TCP之上,所有传输的 ...

  5. spring 4.0下集成webservice

    该教程使用的项目可参见: Intellij Idea下搭建基于Spring+SpringMvc+MyBatis的WebApi接口架构 具体源码请参见GitHub: https://github.com ...

  6. web.csproj Compile 下出现两个同名 xxx.cs 项目中出现两个xxx.cs

    删掉一个就好了 ItemGroup Compile 为加载的cs代码文件

  7. XtraTreeList直接显示Access数据库表中的数据

    方法1:点击在拖入的显示控件(TreeList)右上方的箭头,在Treelist任务中选择数据源,添加项目数据源,依次选择数据库.数据集,新建连接,浏览选择数据库(*.mdb),依次点击 下一步,选择 ...

  8. ADF_ADF Framework基本概念(概念)

    2014-01-01 Created By BaoXinjian

  9. Android Scrollview嵌套RecyclerView导致滑动卡顿问题解决

    一个比较长的界面一般都是Scrollview嵌套RecyclerView来解决.不过这样的UI并不是我们开发人员想看到的,实际上嵌套之后.因为Scrollview和RecyclerView都是滑动控件 ...

  10. 使用Xcode 查看objective-C的汇编代码

    Xcode自带将某一个源文件转化成汇编的功能.如图: 汇编的部分代码例如以下: # Assembly output for assemble.c # Generated at 2:29:34 下午 o ...