题意:

  给一个数字n,求从1~n中有多少个数是含有49的,比如49,149,1490等都是含49的。

思路:

  2^64也顶多是十进制的20多位,那么按十进制位来分析更简单。如果能计算k位十进制数中分别有多少个含49的,那么计算就简单了。

  首先要求关于十进制位的一些信息,比如:i位的十进制数包含49有多少个,不包含49的多少个(除掉最高位是9的数量),不包含49但是最高位是9的有多少个(因为可能和更高一位组合成49)。注意精度,注意爆longlong。

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. using namespace std;
  4. const int N=;
  5. LL dp[N][];
  6. int s[];
  7.  
  8. void init()
  9. {
  10. dp[][]=;
  11. for(int i=; i<N; i++)
  12. {
  13. dp[i][]=dp[i-][]*-dp[i-][]; //dp[i][0]代表长度为 i 并且不含有49的数字的个数;
  14. dp[i][]=dp[i-][]; //dp[i][1]代表长度为 i 并且不含有49,但是最高位是9的数字的个数;
  15. dp[i][]=dp[i-][]+dp[i-][]*; //dp[i][2]代表长度为 i 并且含有49的数字的个数。
  16. }
  17. }
  18.  
  19. int main()
  20. {
  21. init();
  22. freopen("input.txt", "r", stdin);
  23. LL t, n;
  24. cin>>t;
  25. while(t--)
  26. {
  27. memset(s,,sizeof(s));
  28. scanf("%lld",&n);
  29. int cnt=;
  30. n++; //个位上必须大出1,方便计算出现紧挨着的49的情况。
  31. while(n)
  32. {
  33. s[++cnt]=n%; //逐位提取出来
  34. n/=;
  35. }
  36. LL ans=;
  37. int last=, flag=;
  38. for(int i=cnt; i>; i--) //具体就是要分析什么情况下会出现49,而且不能计算重复。
  39. {
  40. ans+=s[i]*dp[i-][];
  41.  
  42. if(flag) ans+=dp[i-][]*s[i]; //之前出现过紧挨着的49,那么第i位所可能出现的0~s[i]-1都与dp[i-1][0]个构成符合条件的数。
  43.  
  44. if(!flag&&s[i]>) ans+=dp[i-][]; //s[i]大于4的情况,如果flag为true,那么都会在之前的紧挨49之后的那一步被统计掉。
  45.  
  46. if(last==&&s[i]==) flag=true; //一旦flag开启,一直开启。目的是为了计算上限。
  47.  
  48. last=s[i];
  49. }
  50. cout<<ans<<endl;
  51. }
  52. return ;
  53. }

AC代码

通用的解法。

  1. //#include <bits/stdc++.h>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <map>
  7. #include <algorithm>
  8. #include <vector>
  9. #include <iostream>
  10. #define pii pair<int,int>
  11. #define INF 0x7f3f3f3f
  12. #define LL long long
  13. #define ULL unsigned long long
  14. using namespace std;
  15. const double PI = acos(-1.0);
  16. const int N=;
  17.  
  18. ULL dp[N][];
  19. int bit[N];
  20.  
  21. void pre_cal()
  22. {
  23. dp[][]=;
  24. for(int i=; i<=; i++ ) //计算不含49的
  25. {
  26. dp[i][]=*dp[i-][]-dp[i-][];
  27. dp[i][]=dp[i-][]; //以9开头
  28. }
  29. }
  30.  
  31. ULL cal(ULL n) //计算区间[0~n]吉利的数量
  32. {
  33. int len=, i;
  34. ULL big=n;
  35. while(n)
  36. {
  37. bit[++len]=n%;
  38. n/=;
  39. }
  40. bit[len+]=;
  41. ULL ans=;
  42. for(i=len ;i>; i--)
  43. {
  44. ans+=dp[i-][]*bit[i];
  45. if(bit[i]>) ans-=dp[i-][];
  46. if(bit[i+]==&&bit[i]==) break;
  47. }
  48. if(i==) ans++; //n本身是否吉利?
  49. return big-ans+;
  50. }
  51.  
  52. int main()
  53. {
  54. //freopen("input.txt","r",stdin);
  55. pre_cal();
  56. int t;cin>>t;
  57. ULL s;
  58. while(t--)
  59. {
  60. scanf("%lld",&s);
  61. printf("%llu\n",cal(s));
  62. }
  63. return ;
  64. }

AC代码

hdu 3555 Bomb 炸弹(数位DP,入门)的更多相关文章

  1. hdu 3555 Bomb(数位dp入门)

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Subm ...

  2. HDU 3555 Bomb(数位DP模板啊两种形式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...

  3. HDU 3555 Bomb(数位DP)

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Subm ...

  4. 动态规划晋级——HDU 3555 Bomb【数位DP详解】

    转载请注明出处:http://blog.csdn.net/a1dark 分析:初学数位DP完全搞不懂.很多时候都是自己花大量时间去找规律.记得上次网络赛有道数位DP.硬是找规律给A了.那时候完全不知数 ...

  5. HDU 3555 Bomb (数位DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题目大意:从0开始到给定的数字N所有的数字中遇到“49”的数字的个数. Sample Input ...

  6. hdu 3555 Bomb 【数位DP】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题意:上一题是不要62 这个是"不要49" 代码: #include < ...

  7. hdu 3555 Bomb ( 数位DP)

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Subm ...

  8. HDU 2089 - 不要62 - [数位DP][入门题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  9. Hdu 2089 不要62 (数位dp入门题目)

    题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...

  10. hdu 4722 Good Numbers( 数位dp入门)

    Good Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

随机推荐

  1. nginx proxy https

    server {listen 443;server_name mail.jb51.net; ssl on;ssl_certificate server.crt;ssl_certificate_key ...

  2. int和Integer及拆箱与装箱

    int和Integer 如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下In ...

  3. Ubuntu解压windows下的.zip文件出现乱码的解决办法

    乱码类似这样的:╫╩┴╧╖┤╤▌▓т╒╛╦┘╢╚│ 这个主要是因为zip文件对文件名的编码默认为当前环境的locale,如在windows下压缩的zip文件,在linux下其中的中文名便会乱码.这是z ...

  4. 1.13-1.14 Hive Action

    一.Hive Action 1.创建文件 [root@hadoop-senior oozie-apps]# pwd /opt/cdh-5.3.6/oozie-4.0.0-cdh5.3.6/oozie- ...

  5. html5代码如何转成小程序代码

    插件源码 链接:https://pan.baidu.com/s/1pGY8ZsdESaQGEzoEgpb_Rw 提取码:s1ix  放到与pages文件夹同级目录下 js中调用 //引入 var wx ...

  6. HDOJ1874最短路【spfa】

    //不知道切过这道题目几次了,这次又wa了...双向路啊....这波简直无奈了,今晚又是浪成狗!!!! #include<cstdio> #include<vector> #i ...

  7. IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie常用方法

    以下是在Servlet中操作Cookie时可使用的有用的方法列表 ●  public void setDomain(String pattern) 该方法设置cookie适用的域,例如 itxdl.c ...

  8. Oracle GoldenGate对接 Oracle 11g和Kafka

    本文主要是向读者介绍如何通过 ogg 为 oracle 数据库的变更操作实时同步到大数据产品 kafka 上. 开始介绍前,先为读者介绍一下环境背景 机器ip 和其对应的服务 192.168.88.1 ...

  9. UVA10140 Prime Distance【素数/数论】By cellur925

    题目传送门 我们注意到,L,R是肥肠大的.........我们不可能在1s内筛出2^31内的全部质数. “上帝为你关上一扇门,同时为你打开一扇窗” 我们又注意到,R-L是肥肠比较小的,珂以从这入手解决 ...

  10. typescript学习笔记(一)----基础类型

    1.使用typescript前第一个操作就是全局配置typescript环境 ---------------npm install -g typescript 2.typescript(以下称为ts, ...