2004: 追梦之人

描述

题目描述:

为了纪念追梦人,粉丝们创造了一种新的数——“追梦数”。追梦数要满足以下两个条件:
1、数字中不能出现“7”
2、不能被7整除。
比如:777和4396就不是追梦数,而666是追梦数。现在他们想知道,1到N中有多少个追梦数。

输入:

多组数据。
第一行给出一个正整数T。T为数据组数。
接下来T行,每行包括一个正整数N。
(1 \leq T \leq 10001≤T≤1000) 
(1 \leq N \leq 10^{18}1≤N≤1018)

输出:

对于每组数据,在单独的一行中输出一个整数表示1到N中有多少个追梦数。

样例输入
  1. 4
    10
    14
    17
    100
样例输出
  1. 9
    12
    14
    70

当初石乐志要维护三个东西,后来发觉数位只要维护两个东西就好了。
我们的答案是n-被7整除的数-不被7整除但包含7的数。
被7整除的数n/7即可求出。
后面这个写个数位dp即可。
dpi[k]表示长度为i,膜7的余数为j,是否含7的情况为k(k为0表示不含,为1表示含)的数的数量,考虑当前的第i位为x,之前的i-1位组成的数膜7的余数为y,那么dpi+=dpi-1。如果x不是7,那么k应该是0转移到0,1转移到1;如果x是7,那么都转移到k=1。剩下的就是裸的数位dp了。
注意边界。

  1. #include<bits/stdc++.h>
  2. #define clr(x) memset(x,0,sizeof(x))
  3. #define clr_1(x) memset(x,-1,sizeof(x))
  4. #define mod 7
  5. #define LL long long
  6. #define INF 0x3f3f3f3f
  7. #define mp make_pair
  8. #define pb push_back
  9. #define mp make_pair
  10. #define fi first
  11. #define se second
  12. using namespace std;
  13. const int N=1e5+;
  14. LL all[][][],num[];
  15. void init()
  16. {
  17. all[][][]=;
  18. num[]=;
  19. for(int i=;i<=;i++)
  20. num[i]=(num[i-]*)%mod;
  21. for(int i=;i<=;i++)
  22. for(int j=;j<=;j++)
  23. for(int k=;k<;k++)
  24. if(j!=)
  25. {
  26. all[i][(int)(j*num[i]%mod+k)%mod][]+=all[i-][k][];
  27. all[i][(int)(j*num[i]%mod+k)%mod][]+=all[i-][k][];
  28. }
  29. else
  30. all[i][(int)(j*num[i]%mod+k)%mod][]+=all[i-][k][]+all[i-][k][];
  31. }
  32. LL n,m,k;
  33. LL ans;
  34. int a[N],t,now;
  35. bool flag;
  36. int T;
  37. int main()
  38. {
  39. init();
  40. scanf("%d",&T);
  41. while(T--)
  42. {
  43. scanf("%lld",&n);
  44. ans=n-n/;
  45. m=;
  46. n++;
  47. while(n)
  48. {
  49. a[++m]=n%;
  50. n/=;
  51. }
  52. now=;
  53. flag=;
  54. for(int i=m;i>=;i--)
  55. {
  56. for(int j=;j<a[i];j++)
  57. {
  58. for(int k=;k<mod;k++)
  59. if((j*num[i]%mod+k+now)%mod!=)
  60. {
  61. ans-=all[i-][k][];
  62. if(flag || j==mod)
  63. ans-=all[i-][k][];
  64. }
  65. }
  66. now=(now+a[i]*num[i])%mod;
  67. if(a[i]==mod)
  68. flag=;
  69. }
  70. printf("%lld\n",ans);
  71. }
  72. }

NEUQ OJ 2004:追梦之人 (计数数位dp)的更多相关文章

  1. 【BZOJ-1833】count数字计数 数位DP

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][ ...

  2. bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)

    1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...

  3. 【题解】P2602 数字计数 - 数位dp

    P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数 \(a\) 和 \(b\) ,求在 \([a,b]\) 中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中 ...

  4. 目标管理剖析与实践– 献给追梦的人 (转)

      好久没写日志了. 最近总算在忙碌的日子中小小的松了一口气, 过来补起这几个月的空缺. 上次写的Cover Letter & Resume 重点诠释 - 深度剖析没想到居然超过了一万的阅读量 ...

  5. UVA.1640.The Counting Problem / BZOJ.1833.[ZJOI2010]数字计数(数位DP)

    题目链接 \(Description\) 求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示). \(Solution\) 对每位分别DP.注意考虑前导0: 在最后统 ...

  6. 洛谷P2602 [ZJOI2010]数字计数(数位dp)

    数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...

  7. 【BZOJ1833】【ZJOI2010】数字计数 数位DP

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  8. BZOJ 1833 ZJOI2010 count 数字计数 数位DP

    题目大意:求[a,b]间全部的整数中0~9每一个数字出现了几次 令f[i]为i位数(算前导零)中每一个数出现的次数(一定是同样的,所以仅仅记录一个即可了) 有f[i]=f[i-1]*10+10^(i- ...

  9. [Swust OJ 715]--字典序问题(组合数预处理/数位dp)

    题目链接:http://acm.swust.edu.cn/problem/715/ Time limit(ms): 1000 Memory limit(kb): 65535   在数据加密和数据压缩中 ...

随机推荐

  1. 状压dp(B - 炮兵阵地 POJ - 1185 )

    题目链接:https://cn.vjudge.net/contest/276236#problem/B 题目大意:略  具体思路:和我的上一篇写状压dp的思路差不多,不过就是这个题相当于上一个题的升级 ...

  2. 20165227 实验二《Java面向对象程序设计》实验报告

    2017-2018-4 20165227实验二<Java面向对象程序设计>实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...

  3. 修复TortoiseGit文件夹和文件图标不显示问题的多种解决办法以及重启之后TortoiseGit图标注册表又不见了的解决办法

    一 首先进行第一种尝试 打开 regedit.exe ,准备修改注册表 找到 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ ...

  4. pom可以过滤resource 下的文件

  5. tf.summary.merge_all()

    1.自动管理模式 summary_writer = tf.summary.FileWriter('E:/data/tensorflow-master/1.Cnn_Captcha/result/', f ...

  6. PlantUML——4.实例演示1

    给自己发消息 @startuml Alice -> Alice : This is a signal to self.\nIt also demonstrates \nmultiline tex ...

  7. 使用html+css+js实现倒计时,开启你痛苦的倒计时吧

    使用html+css+js实现倒计时,开启你痛苦的倒计时吧 效果图: 这是我痛苦的倒计时,呜呜呜 好啦,再痛苦还是要分享代码,代码如下,复制即可使用: <!DOCTYPE html> &l ...

  8. log4j记录日志到指定文件

    新建类文件: import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; /** * 记录日志到指定文件 ...

  9. hdu 5122 (2014北京现场赛 K题)

    把一个序列按从小到大排序 要执行多少次操作 只需要从右往左统计,并且不断更新最小值,若当前数为最小值,则将最小值更新为当前数,否则sum+1 Sample Input255 4 3 2 155 1 2 ...

  10. hdu 5131 (2014广州现场赛 E题)

    题意:对给出的好汉按杀敌数从大到小排序,若相等,按字典序排.M个询问,询问名字输出对应的主排名和次排名.(排序之后)主排名是在该名字前比他杀敌数多的人的个数加1,次排名是该名字前和他杀敌数相等的人的个 ...