题意:给定区间[L, R]求区间内与7无关数的平方和。一个数当满足三个规则之一则认为与7有关:
1、整数中某一位是7;
2、整数的每一位加起来的和是7的整数倍;
3、这个整数是7的整数倍;

分析:初看起来确实有点麻烦,数位DP还是很容易看出来的,需要维护好三个值dp[ i ][ j ][ k ].num表示数位和为对7的余数为 j ,前面确定的数对7的余数为 k 的情况下, i 位任意与7无关的数一共有多少个;同理 dp[ i ][ j ][ k ].sum 表示这些数的和为多少;dp[ i ][ j ][ k ].sqr 表示这些数的平方和为多少,这三者之间是可以递推的,详见代码。个人觉得将区间左右边界同时代入求解更加优美。

  1. #include <cstdlib>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. typedef long long LL;
  8. const int mod = int(1e9)+;
  9. int hbit[], lbit[];
  10. int _POW[];
  11. struct STATUS {
  12. int num, sum, sqr;
  13. bool flag;
  14. STATUS(int _num, int _sum, int _sqr) : num(_num), sum(_sum), sqr(_sqr) {}
  15. STATUS() : flag(false) {}
  16. // sum = sum {cur*10^p*num' + sum'}
  17. // sqr = sum {num'*(cur*10^p)^2 + sqr' + 2*cur*10^p*sum'}
  18. }dp[][][];
  19.  
  20. STATUS cal(int p, int srem, int mrem, bool lb, bool hb) {
  21. if (p == ) {
  22. if (srem != && mrem != ) return STATUS(, , );
  23. else return STATUS(, , );
  24. }
  25. if (!lb && !hb && dp[p][srem][mrem].flag) {
  26. return dp[p][srem][mrem];
  27. }
  28. STATUS ret(, , ), tmp;
  29. int sta = lb ? lbit[p] : ;
  30. int end = hb ? hbit[p] : ;
  31. for (int i = sta; i <= end; ++i) {
  32. if (i == ) continue;
  33. tmp = cal(p-, (srem+i)%, (mrem*+i)%, lb&&i==sta, hb&&i==end);
  34. ret.num = (1LL*ret.num + 1LL*tmp.num) % mod;
  35. ret.sum = (1LL*ret.sum + 1LL*i*_POW[p-]%mod*tmp.num%mod+tmp.sum) % mod;
  36. ret.sqr = (1LL*ret.sqr + 1LL*i*_POW[p-]%mod*i%mod*_POW[p-]%mod*tmp.num%mod + 1LL*tmp.sqr + 2LL*i*_POW[p-]%mod*tmp.sum%mod)%mod;
  37. }
  38. if (!lb && !hb) {
  39. dp[p][srem][mrem] = ret;
  40. dp[p][srem][mrem].flag = true;
  41. }
  42. return ret;
  43. }
  44.  
  45. int count(LL l, LL r) {
  46. memset(lbit, , sizeof (lbit));
  47. memset(hbit, , sizeof (hbit));
  48. int lidx = , hidx = ;
  49. while (l) {
  50. lbit[lidx++] = l % ;
  51. l /= ;
  52. }
  53. while (r) {
  54. hbit[hidx++] = r % ;
  55. r /= ;
  56. }
  57. return cal(max(lidx-, hidx-), , , true, true).sqr;
  58. }
  59.  
  60. int main() {
  61. _POW[] = ;
  62. for (int i = ; i < ; ++i) {
  63. _POW[i] = (1LL*_POW[i-]*) % mod;
  64. }
  65. int T;
  66. LL l, r;
  67. scanf("%d", &T);
  68. while (T--) {
  69. scanf("%I64d %I64d", &l, &r);
  70. printf("%d\n", count(l, r));
  71. }
  72. return ;
  73. }

HDU-4507 吉哥系列故事——恨7不成妻 数位DP的更多相关文章

  1. 吉哥系列故事——恨7不成妻(数位DP)

    吉哥系列故事——恨7不成妻 http://acm.hdu.edu.cn/showproblem.php?pid=4507 Time Limit: 1000/500 MS (Java/Others)   ...

  2. HDU - 4507 - 吉哥系列故事——恨7不成妻(数位DP,数学)

    链接: https://vjudge.net/problem/HDU-4507 题意: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都 ...

  3. hdu4507吉哥系列故事——恨7不成妻 (数位dp)

    Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: ...

  4. hdu-4507 吉哥系列故事——恨7不成妻 数位DP 状态转移分析/极限取模

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 求[L,R]中不满足任意条件的数的平方和mod 1e9+7. 条件: 1.整数中某一位是7:2.整数的每一 ...

  5. HDU 4507 吉哥系列故事――恨7不成妻(数位DP+结构体)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关 1.整数中某一位是7: ...

  6. HDU 4507 吉哥系列故事——恨7不成妻

    需要推下平方和的式子..维护个数,和,平方和. #include<iostream> #include<cstdio> #include<cstring> #inc ...

  7. HDU 4507 吉哥系列故事——恨7不成妻 (数位DP)

    题意: 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关: 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 给定一个区间[L,R],问在此区 ...

  8. 【hdu4507】吉哥系列故事——恨7不成妻 数位dp

    题目描述 求 $[L,R]$ 内满足:数位中不包含7.数位之和不是7的倍数.本身不是7的倍数 的所有数的平方和 mod $10^9+7$ . 输入 输入数据的第一行是case数T(1 <= T ...

  9. hdu4507 吉哥系列故事——恨7不成妻[数位DP]

    这题面什么垃圾玩意儿 首先看到问题格式想到数位DP,但是求的是平方和.尝试用数位DP推出. 先尝试拼出和.设$f[len][sum][mod]$表示填到$len$位,已填位置数位和$sum$,数字取余 ...

随机推荐

  1. 【转】如何安装mysql服务

    转载地址:http://www.2cto.com/database/201211/168081.html  我刚开始安装mysql的时候,在windows的服务里面可以看到,但是装了以后有一段时间没有 ...

  2. html里文本保留换行格式

    用<pre></pre>把文本包起来

  3. ZOJ 3860: - Find the Spy

    3860 - Find the Spy Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu S ...

  4. SDUT 2623:The number of steps

    The number of steps Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Mary stands in a stra ...

  5. 20150624_Andriod _web_service_匹配

    using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using S ...

  6. Linux内核同步机制

    http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环 ...

  7. WPFの exit()和close()两个方法的用法

    Application.Exit   方法     通知所有消息泵必须终止,并且在处理了消息以后关闭所有应用程序窗口. Form.Close   方法 关闭窗体. 如果该窗体是应用程序的主启动窗体,则 ...

  8. 2016年11月11日 星期五 --出埃及记 Exodus 20:2

    2016年11月11日 星期五 --出埃及记 Exodus 20:2 "I am the LORD your God, who brought you out of Egypt, out o ...

  9. MySQL PLSQL Demo - 005.IF THEN ELSEIF THEN ELSE END IF

    drop procedure if exists p_hello_world; create procedure p_hello_world(in v_id int) begin ) then sel ...

  10. .Net文件操作

    文件操作 File类,FileInfo类.using System.IO命名空间(一)创建 方法一: 1 private string path = @"F:\Text\aaa.txt&qu ...