题目:

单身!
  依然单身!

  吉哥依然单身!

  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

3
1 9
10 11
17 17

Sample Output

236
221
0

题解:

1、不能出现7的话可以dfs遇到7就continue掉

2、每一位加起来不能是7的倍数,那么我们可以dfs过程中用一个参数来记录它的取余结果

又因为(a+b)%mod=(a%mod+b%mod)%mod,所以我们可以是缩减dp数组的大小

可能有人会有疑问,数位上各位相加最大才9*18.也就开大一点dp数组而已

但是要注意取余mod之后不仅仅缩减了dp数组的大小,还缩短了时间,因为这是在记忆化,范围越小越能大幅度优化时间复杂度

3、这个数也不能是7的倍数,那么就可以用秦九韶取余来优化

4、最难的就是我们最后求的结果是每一个数的平方和,大家都看到了数据范围是10^18(我记得有一种方法叫快速相乘,类似于快速幂,这里没有试这一种方法)

在网上找了一篇博客:http://www.freesion.com/article/9575132166/

代码:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<iostream>
5 using namespace std;
6 const int maxn=105;
7 const int mod = 1e9+7;
8 typedef long long ll;
9 struct DP
10 {
11 ll cnt, sum, sqsum;
12 DP () {}
13 DP (ll cnt, ll sum, ll sqsum): cnt(cnt), sum(sum), sqsum(sqsum) {}
14 }dp[20][10][10];
15 //dp[x][y][z]表示在数字的第x位上,且各位数字之和取余7得结果(不取余直接存的话会内存超限)为y,目前这个数取余7结果
16 //(什么叫目前这个数,就是你第一位枚举的是1第二位枚举的是2,那么就是12)
17 //然后题目要求我们最后求的结果是“所有可行数的平方和取余于mod”,这个时候肯定不能直接平方
18 //由(a+b)^2=a^2+b^2+2ab,那么一个二位数(xy)=x*10+y;(xy)^2=(x*10+y)^2
19 //那么一个多位数也可以通过递归方式来求他的平方
20 //参考链接:http://www.freesion.com/article/9575132166/
21 ll tend[20];
22 ll v[maxn];
23 DP dfs(ll pos, ll mod1, ll mod2, bool limit)
24 {
25 if (pos == -1) return DP(mod1!=0 && mod2!=0, 0, 0);
26 if (!limit && dp[pos][mod1][mod2].cnt != -1) return dp[pos][mod1][mod2];
27
28 ll up=limit?v[pos]:9;
29 DP ans=DP(0,0,0);
30 for(ll i=0;i<=up;++i)
31 {
32 if(i==7) continue;
33 DP t = dfs(pos-1, (mod1+i)%7, (mod2*10+i)%7, limit&&(i==up));
34 ans.cnt += t.cnt;
35 ans.cnt %= mod;
36
37 ans.sum += t.sum + t.cnt*i%mod*tend[pos]%mod;
38 ans.sum %= mod;
39
40 ans.sqsum += t.cnt*i*i%mod*tend[pos]%mod*tend[pos]%mod;
41 ans.sqsum += t.sqsum + 2*i*tend[pos]%mod*t.sum%mod;
42 ans.sqsum %= mod;
43 }
44 if (!limit) dp[pos][mod1][mod2] = ans;
45 return ans;
46 }
47 ll solve(ll ans)
48 {
49 ll pos=0;
50 while(ans)
51 {
52 v[pos++]=ans%10;
53 ans/=10;
54 }
55 return dfs(pos-1,0,0,true).sqsum;
56 }
57 int main()
58 {
59 ll t,l,r;
60 tend[0]=1;
61 for (ll i = 1; i < 20; i++)
62 tend[i] = (tend[i-1]*10)%mod;
63 scanf("%I64d",&t);
64 memset(dp,-1,sizeof(dp));
65 while(t--)
66 {
67
68 scanf("%I64d%I64d",&l,&r);
69 printf("%I64d\n",(solve(r)-solve(l-1)+mod)%mod);
70 }
71 return 0;
72 }

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

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

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

  2. 吉哥系列故事――恨7不成妻 HDU - 4507 数位dp

    思路  和普通的DP不一样的是 这里求的是满足条件的数的平方的和 而数位DP只跟数每位是什么密切相关  所以要开一个结构 (多加一个 数的和sum 和平方和qsum)存一下各个状态的和的情况 dp[p ...

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

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

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

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

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

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

  6. B - 吉哥系列故事——恨7不成妻

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

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

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

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

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

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

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

随机推荐

  1. Win 10 Docker安装和简单使用

    Win 10 Docker安装和简单使用 1.环境准备 Docker for Windows需要运行在64位Windows 10 Pro专业版.企业版或教育版(1607年纪念更新,版本14393或更高 ...

  2. MySQL常用的一些(就几个)聚合函数

    聚合函数 (常用) 函数名称 描述 CONUT() 记数 SUM() 求和 AVG() 平均值 MAX() 最大值 MIN() 最小值 -- ================= 聚合函数 ====== ...

  3. 【MySQL】centos6中/etc/init.d/下没有mysqld启动文件,怎么办

    如果/etc/init.d/下面没有mysqld的话,service mysqld start也是不好使的,同样,chkconfig mysqld on也是不能用 解决办法: 将mysql的mysql ...

  4. 【Oracle】从删除的recyclebin中查看并恢复数据

    如果数据库中用了drop删除表,后面没有加上purge的话,会出现在oracle的回收机制中 dba_recyclebin可以查看当前删除的都是哪些 这个只是部分截图,可以看到删除的对象是什么,删除的 ...

  5. 使用call、apply、bind继承及三者区别

    js里的继承方法有很多,比如:使用原型链的组合继承.es6的Class.寄生继承以及使用call.apply.bind继承.再说继承之前,我们先简单了解下它们的区别. 一.区别: 同:三者都是改变函数 ...

  6. [分享] 最流行的 10 个 JavaScript 库

    1. Lodash https://github.com/lodash/lodash 一个工具库,用得还蛮多. 2. Chalk https://github.com/chalk/chalk 给终端加 ...

  7. java 不利用第三个变量的情况下将值互换

    package com.zcj.eg001; public class VarChange { public static void main(String[] args) { int a = 10; ...

  8. RocketMQ—消息队列入门

    消息队列功能介绍 字面上说的消息队列是数据结构中"先进先出"的一种数据结构,但是如果要求消除单点故障,保证消息传输可靠性,应对大流量的冲击,对消息队列的要求就很高了.现在互联网的& ...

  9. 干电池升压5V,功耗10uA

    PW5100干电池升压5V芯片 输出电容: 所以为了减小输出的纹波,需要比较大的输出电容值.但是输出电容过大,就会使得系统的 反应时间过慢,成本也会增加.所以建议使用一个 22uF 的电容,或者两个 ...

  10. js模仿京东首页的倒计时功能

    模仿京东首页的倒计时 我们学习了定时器,可以用定时器做一个倒计时,于是我模仿了京东首页倒计时. 先看看京东首页的倒计时. 思路: 如何倒计时? 给一个未来的时间.然后计算未来时间到现在的时间戳. 用定 ...