题目描述

单身!

依然单身!

吉哥依然单身!

DS级码农吉哥依然单身!

所以,他生平最恨情人节,不管是214还是77,他都讨厌!

吉哥观察了214和77这两个数,发现:

2+1+4=7
7+7=7*2
77=7*11

最终,他发现原来这一切归根到底都是因为和\(7\)有关!所以,他现在甚至讨厌一切和7有关的数!

什么样的数和\(7\)有关呢?

如果一个整数符合下面\(3\)个条件之一,那么我们就说这个整数和\(7\)有关——

  1. 整数中某一位是\(7\);
  2. 整数的每一位加起来的和是\(7\)的整数倍;
  3. 这个整数是\(7\)的整数倍;

现在问题来了:吉哥想知道在一定区间内和\(7\)无关的数字的平方和。

Input

输入数据的第一行是\(case\)数\(T(1 <= T <= 50)\),然后接下来的\(T\)行表示\(T\)个\(case\);

每个\(case\)在一行内包含两个正整数\(L, R(1 <= L <= R <= 10^{18})\)。

Output

请计算\([L,R]\)中和\(7\)无关的数字的平方和,并将结果对\(10^{9}+7\)求模后输出。

Sample Input

  1. 3
  2. 1 9
  3. 10 11
  4. 17 17

Sample Output

  1. 236
  2. 221
  3. 0

数位\(dp\)题。

以前,我们遇到的数位\(dp\)题,都是求区间满足条件的数的个数。

那区间平方和怎么维护呢?

其实,区间平方和也可以做差求解。

那么,\(dp\)的同时需要维护\(3\)个值,开个结构体存一下就行了。

让我们一位位的进行计算。

1.满足条件的数的个数。这个利用普通的数位\(dp\)去维护就行了。

2.满足条件的数的和。这个维护时,加上子状态的值,以及该状态的位数和子状态的个数。

\(12=(1*10^{1}+2*10^{0})\)

因为我们枚举当前的位置\(x\)上放了\(i\),则i在原数中对应\(i*10^{x}\)

\(1\)是你当前枚举的数字,\(2*10^{0}\)是你子状态的答案,所以状态的转移也就出来了。

当前sum=子状态sum+当前位的数字\(10^{当前位数}\)子状态个数。

3.满足条件的数的平方和。这个维护时,加上子状态的值,以及该状态的位数和子状态的个数。

\(12^{2}=(1*10^{1}+2*10^{0})^{2}\)

\(12^{2}=1^{2}*(10^{1})^{2}+(2*10^{0})^{2}+2*(2*10^{0})*(1*10^{1})\)

让我们回顾一下平方和公式:

\((a+b)^{2}=a^{2}+b^{2}+2*a*b\)

\(a\)就是当前位\(i*10^{当前位数}\),\(b\)是子状态和。

状态的转移也就出来了。

当前平方和=子状态平方和+\(2*i∗10^{当前位数}*子状态和\)+\((i∗10^{当前位数})^{2}*子状态个数\)

注意,取模后记得负数要加上模数再取模。

代码如下

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. using namespace std;
  5. const int mod=1000000007;
  6. int T,num[25];
  7. long long a,b,pow[20]={0,1};
  8. struct node {
  9. long long cnt,sum,qsum;
  10. } dp[25][15][15];
  11. node dfs(int pos,int mod1,int mod2,int limit) {
  12. if(pos==0)return <%mod1&&mod2,0,0%>;
  13. if(!limit&&dp[pos][mod1][mod2].cnt!=-1)return dp[pos][mod1][mod2];
  14. int up=limit?num[pos]:9;
  15. node res=<%0,0,0%>;
  16. for(int i=0; i<=up; i++) {
  17. if(i==7)continue;
  18. node temp=dfs(pos-1,(mod1+i)%7,(mod2*10+i)%7,limit&(i==up));
  19. res.cnt=(res.cnt+temp.cnt)%mod;
  20. res.sum=(res.sum+temp.sum)%mod;
  21. res.sum=(res.sum+((i*pow[pos])%mod)*temp.cnt%mod)%mod;
  22. res.qsum=(res.qsum+temp.qsum%mod)%mod;
  23. res.qsum=(res.qsum+((2*pow[pos]*i)%mod*temp.sum%mod)%mod)%mod;
  24. res.qsum=(res.qsum+((pow[pos]*pow[pos])%mod*temp.cnt%mod*(i*i)%mod)%mod);
  25. }
  26. if(!limit)dp[pos][mod1][mod2]=res;
  27. return res;
  28. }
  29. long long solve(long long n) {
  30. int len=0;
  31. while(n)num[++len]=n%10,n/=10;
  32. return dfs(len,0,0,1).qsum;
  33. }
  34. int main() {
  35. scanf("%d",&T);
  36. for(int i=2;i<20;i++)pow[i]=(pow[i-1]*10)%mod;
  37. for(int i=0; i<=20; i++)
  38. for(int j=0; j<=10; j++)
  39. for(int k=0; k<=10; k++)dp[i][j][k]=<%-1,0,0%>;
  40. while(T--) {
  41. scanf("%lld%lld",&a,&b);
  42. printf("%lld\n",(((solve(b)-solve(a-1))%mod+mod)%mod));
  43. }
  44. }

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

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

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

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

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

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

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

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

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

  5. HUD 4507 吉哥系列故事——恨7不成妻

    传送门 三个限制都可以数位 $dp$ , $dfs$ 是维护当前位,之前各位总和模 $7$ 意义下的值,之前填的数模 $7$ 意义下的值,是否贴着限制 主要现在求的是各个合法数的平方的和,比较恶心 开 ...

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

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

  7. [HDU4507]吉哥系列故事——恨7不成妻

    [HDU4507]吉哥系列故事--恨7不成妻 试题描述 单身!依然单身!吉哥依然单身!DS级码农吉哥依然单身!所以,他生平最恨情人节,不管是214还是77,他都讨厌!吉哥观察了214和77这两个数,发 ...

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

    吉哥系列故事--恨7不成妻 传送门 Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥 ...

  9. Day9 - J - 吉哥系列故事——恨7不成妻 HDU - 4507

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

  10. 吉哥系列故事――恨7不成妻 HDU - 4507

    题目: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 ...

随机推荐

  1. https://stackblitz.com/github/cwiki-us-angular/cwiki-us-angular-app 导入后如何添加到自己的项目

    将 https://stackblitz.com/github/cwiki-us-angular/cwiki-us-angular-app 导入到界面后,如何将这个项目添加到自己的项目里面. 然后再自 ...

  2. 51 Nod 数字1的数量

    1009 数字1的数量  基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的 ...

  3. THUSC2016 成绩单

    题目链接:Click here Solution: 我们设\(f[l][r][x][y]\)表示在原区间\(l\sim r\) 内还未被取走的值最大为\(x\)最小为\(y\)时的代价,这里我们只考虑 ...

  4. codevs 5969 [AK]刻录光盘x

                         题目描述 Description • 在FJOI2010夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学 ...

  5. POJ 6621: K-th Closest Distance(主席树 + 二分)

    K-th Closest Distance Time Limit: 20000/15000 MS (Java/Others)    Memory Limit: 524288/524288 K (Jav ...

  6. java命令--jstack 工具【转载】

    一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...

  7. Scala学习(四)——模式匹配与函数组合

    函数组合 让我们创建两个函数: def f(s: String) = "f(" + s + ")" def g(s: String) = "g(&qu ...

  8. 四、smarty模板的自定义函数

    smarty模板的自定义函数(这里介绍的是常用) 分为三个种类: 1.  变量调节器 2.  函数 3.  块函数 三个种类插件的用法: 1.  变量调解器的用法, <{$var|myfun:a ...

  9. javascript模块化之CommonJS、AMD、CMD、UMD、ES6

    javascript模块化之CommonJS.AMD.CMD.UMD.ES6 一.总结 一句话总结: CommonJS是同步加载模块,用在服务端:AMD是异步加载模块,用于浏览器端 1.为什么服务器端 ...

  10. JS闭包的理解及常见应用场景

    JS闭包的理解及常见应用场景 一.总结 一句话总结: 闭包是指有权访问另一个函数作用域中的变量的函数 1.如何从外部读取函数内部的变量,为什么? 闭包:f2可以读取f1中的变量,只要把f2作为返回值, ...