首先来说,,这题我wrong了好几次,代码力太弱啊。。很多细节没考虑。。

题意:给定两个数 L R,1 <= L <= R <= 10^18 ;求L 到 R 间 与 7 无关的数的平方和

什么数与7 无关?

1 没有数字7

2 不是7的倍数

3 所有数字的和不是7的倍数

我们先来考虑一下  如果这题问的是: L 到 R 间 与7 无关的数有多少个?

这道题该怎么思考? 给一点提示  dp 方程可以写成三维的 num(i,j,k) 其中 i 代表数的位数 j 代表 这个数对7取模的余数 k 代表这个数所有数字和对7取模的值,至于num(i,j,k) 当让就是这种数的个数了, 方程的转化也很简单  从数末尾逐步填数字 l (0~9)的话 num(i+1,(j*10+l)%7,(k+l)%7)+=num(i,j,k);

接下来 我默认你知道 num[i][j][k] 该怎么求了 这个时候 再来考虑一下 L 到 R 间与7 无关的数的和 ? 这个时候不用考虑的太复杂,,因为首先,你在求num[i][j][k]的时候已经求出了所有的满足条件的数的所有可能,要求和,无非就是哪一位的那个数字有多少个。

如果我们的dp是逐步往数的末尾填数 ,这个时候可以这样写 sum(i,j,k)其中i,j,k和num的i,j,k一个意思,然后sum表示满足这种情况的数的和 方程的转换可以写为:同样从数末尾逐步填数字 l (0~9)-- num(i+1,(j*10+l)%7,(k+l)%7)+=sum(i,j,k)*10+num(i,j,k)*l;

再来考虑平方和就比较容易了,,我们知道如果前面的数是a 我们往后面塞一个数字l 那么我们要求的数的平方和是---(10*a+l)^2 也就是100*a*a+20*a*l+l*l

方程我就不写了,,然后接下来的思路都是和上面的类似

贴出渣渣的代码。。。

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include <string>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <map>
  8. #include <set>
  9. #include <queue>
  10. #include <stack>
  11. #include<stdlib.h>
  12. #include <vector>
  13. using namespace std;
  14. #pragma comment(linker, "/STACK:1024000000,1024000000")
  15. #define ll __int64
  16. #define CL(a,b) memset(a,b,sizeof(a))
  17. #define MAXNODE 100010
  18. ll MOD=;
  19.  
  20. ll s,e;
  21.  
  22. ll dp[][][];
  23. ll wsu[][][];
  24. ll num[][][];
  25. ll val[];
  26. void initval()
  27. {
  28. int i=;
  29. val[]=;
  30. val[]=;
  31. for(i=;i<=;i++)
  32. {
  33. val[i]=val[i-]*;
  34. }
  35. }
  36.  
  37. void initdp()
  38. {
  39. int i,j,k,l;
  40. CL(dp,);
  41. CL(num,);
  42. CL(wsu,);
  43. for(i=;i<;i++)
  44. {
  45. if(i==)continue;
  46. dp[][i%][i%]+=i*i;
  47. wsu[][i%][i%]+=i;
  48. num[][i%][i%]++;
  49. }
  50. num[][][]=;
  51. for(i=;i<;i++)
  52. {
  53. for(j=;j<;j++)
  54. {
  55. for(k=;k<;k++)
  56. {
  57. for(l=;l<;l++)
  58. {
  59. if(l==)continue;
  60. num[i+][(j+l)%][(k*+l)%]+=num[i][j][k]%MOD;
  61. num[i+][(j+l)%][(k*+l)%]%=MOD;
  62. wsu[i+][(j+l)%][(k*+l)%]+=(wsu[i][j][k]*(ll)+(ll)l*(num[i][j][k]))%MOD;
  63. wsu[i+][(j+l)%][(k*+l)%]%=MOD;
  64. dp[i+][(j+l)%][(k*+l)%]+=(((ll)l*(ll)l*num[i][j][k])+dp[i][j][k]*+(ll)*(ll)l*wsu[i][j][k]*(ll))%MOD;
  65. dp[i+][(j+l)%][(k*+l)%]%=MOD;
  66. }
  67. // printf("%d %d %d %I64d\n",i,j,k,dp[i][j][k]);
  68. }
  69. }
  70. }
  71. }
  72.  
  73. ll pro(ll n)
  74. {
  75. if(n==)return ;
  76. ll rem=;
  77. ll nu[];
  78. int w,i,j,k;
  79. nu[]=;
  80. ll tem=n,va;w=,rem=;
  81. while(tem!=)
  82. {
  83. nu[w]=tem%;
  84. tem/=;
  85. w++;
  86. }
  87. va=;
  88. int su=;
  89. ll v=;
  90. while(--w)
  91. {
  92. if(nu[w]==)
  93. {
  94. for(i=;i<w;i++)nu[i]=;
  95. nu[w]=;
  96. }
  97. for(i=nu[w]-;i>=;i--)
  98. {
  99. if(i==)continue;
  100. for(j=;j<;j++)
  101. {
  102. for(k=;k<;k++)
  103. {
  104. if((su+i+j)%==)continue;
  105. if(((ll)v+(ll)i*val[w]+(ll)k)%==)continue;
  106. ll pre=(va+(ll)i*(val[w]%MOD))%MOD;
  107. pre%=MOD;
  108. rem+=(((pre*pre)%MOD)*(num[w-][j][k]%MOD))%MOD;
  109. rem%=MOD;
  110. rem+=dp[w-][j][k]%MOD;;
  111. rem%=MOD;
  112. rem+=((((ll)*pre)%MOD)*wsu[w-][j][k]%MOD)%MOD;
  113. rem%=MOD;
  114. }
  115. }
  116. }
  117. rem%=MOD;
  118. va+=(nu[w]*(val[w]%MOD))%MOD;
  119. va%=MOD;
  120. v+=nu[w]*(val[w]%);
  121. v%=;
  122. su+=nu[w];
  123. su%=;
  124. }
  125. if(v!=&&su!=)rem+=(va*va)%MOD;
  126. return rem%MOD;
  127. }
  128.  
  129. int main()
  130. {
  131. int tt;
  132. initval();
  133. initdp();
  134. scanf("%d",&tt);
  135. while(tt--)
  136. {
  137. scanf("%I64d %I64d",&s,&e);
  138. ll rs=pro(s-1LL);
  139. ll re=pro(e);
  140. ll rem=re-rs;
  141. rem=rem%MOD;
  142. if(rem<)rem+=MOD;
  143. // printf("%I64d %I64d ",rs,re);
  144. printf("%I64d\n",rem);
  145. }
  146. return ;
  147. }

HDU 4507 有点复杂却不难的数位DP的更多相关文章

  1. 【HDU 5456】 Matches Puzzle Game (数位DP)

    Matches Puzzle Game Problem Description As an exciting puzzle game for kids and girlfriends, the Mat ...

  2. 【HDU 4352】 XHXJ's LIS (数位DP+状态压缩+LIS)

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU - 4389 X mod f(x)(数位dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 为[A,B] 区间内的数能刚好被其位数和整除的数有多少个. 分析 典型的数位dp...比赛时想不出状 ...

  4. 【HDU】4352 XHXJ's LIS(数位dp+状压)

    题目 传送门:QWQ 分析 数位dp 状压一下现在的$ O(nlogn) $的$ LIS $的二分数组 数据小,所以更新时直接暴力不用二分了. 代码 #include <bits/stdc++. ...

  5. HDU 4389——X mod f(x)(数位DP)

    X mod f(x) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  6. hdu 3709 Balanced Number(平衡数)--数位dp

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  7. hdu 2089 记忆化搜索写法(数位dp)

    /* 记忆化搜索,第二维判断是否是6 */ #include<stdio.h> #include<string.h> #define N 9 int dp[N][2],digi ...

  8. hdu:2089 ( 数位dp入门+模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...

  9. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

随机推荐

  1. 教训 Mac下装windows系统 失败后 磁盘空间丢失

    本来Mac上装的是win10 最近老提示快过期了 想到月底就要停止免费更新了 决定装一下win8 然后升级到win10 因为之前有过装win10的经验 所以很轻松 进入Mac 先到bootcamp 取 ...

  2. GO 输出字符数同时输出这个字符串的字节数

    package main import ( "fmt" "unicode/utf8" ) func main(){ var str string str=&qu ...

  3. Nexus Root Toolkit教程—— 解锁与Root

    Nexus Root Toolkit是Nexus系列手机的专属root工具,本工具可为Nexus系列设备提供解锁.root和反解锁,还可以支持重要数据的备份和恢复.本教程以nexus 7二代和Nexu ...

  4. commons-pool2-中的一些配置

      /**                     * 连接失效检测相关                     */                    // 空闲时进行连接测试,会启动异步evi ...

  5. 开源的Owin 的身份验证支持 和跨域支持

    http://identitymodel.codeplex.com/ https://identityserver.github.io/ Windows Identity Foundation 6.1 ...

  6. Sql 高效分页

    http://www.111cn.net/database/mysql/46350.htm http://g.kehou.com/t1032617472.html http://www.cnblogs ...

  7. Row Cache Objects

    This latch comes into play when user processes are attempting to access or update the cached data di ...

  8. BZOJ2023: [Usaco2005 Nov]Ant Counting 数蚂蚁

    2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 56  Solved: 16[S ...

  9. Linux企业级项目实践之网络爬虫(24)——定制规则扩展为垂直爬虫

    在垂直搜索的索引建立之前,我们需要到垂直网站上抓取资源并做一定的处理.垂直搜索与通用搜索不同之处在于,通用搜索不需要理会网站哪些资源是需要的,哪些是不需要的,一并抓取并将其文本部分做索引.而垂直搜索里 ...

  10. 2015第23周一SVN插件安装

    之前想把eclipse(3.7)的SVN插件版本从1.8.x降到1.6.x,上午折腾了好久没弄好,先是尝试在线安装,按网上说的1.6.x的url安装不成功(可能是网络问题,下载不到资源),然后尝试下载 ...