吉哥系列故事——恨7不成妻

Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 4531    Accepted Submission(s): 1480

Problem Description
单身!
  依然单身!
  吉哥依然单身!
  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无关的数的个数num(直接累加)
2.当前状态与7无关的数的和sum(计算需要用到num)
3.当前状态与7无关的数的平方和sqsum(计算需要用到前两个变量)
(1)初始化数组c保存10的次方数,方便dfs时还原数字所在的位置。定义变量ans保存结果,sumper保存当前状态的每位数字的和,val保存当前数字的值。
(2)num 容易得到,只需累加即可。
ans.num = ( ans.num + temp.num ) % MOD;
(3)当前状态下与7无关的数的和就是 : 当前数字 i * 10^pos * num + sum
(共有num个数,和为sum,i*10^pos 即高位的值 ,再乘个数num,即num个数的高位值的和,两者相加即为当前与7无关的数的和)
ans.sum = ( ans.sum + ((c[pos]*i)%MOD*temp.num%MOD + temp.sum)%MOD )%MOD;
(4)当前状态下与7无关的数的平方和就是  ( i * 10^pos + sum )^2 = ( i * 10 ^ pos) ^2 + sum ^ 2 + 2 * sum * i * 10 ^ pos ; 
那么num个与7无关的数的平方和就是:( i * 10^pos + sum )^2 * cnt =( ( i * 10 ^ pos) ^2 + sum ^ 2 + 2 * sum * i * 10 ^ pos ) * cnt
= ( i * 10 ^ pos ) ^ 2 *  num + SUM(sum^2) + 2*i *10^pos * SUM(sum);
= ( i * 10 ^ pos ) ^ 2 *  num + sqsum + 2 * i * 10^pos * sum;
//平方和式子太长分开写(加上num个数的平方和):   ans.sqsum = (ans.sqsum + ((i*c[pos]%MOD)*i%MOD*c[pos]%MOD * temp.num )%MOD )%MOD;ans.sqsum = ( ans.sqsum + (temp.sqsum + ((2*c[pos]*i)%MOD*temp.sum)%MOD) ) % MOD;
Code:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int MOD = 1e9+7;
int a[25];
LL c[25];struct Node
{LL num;LL sum;LL sqsum;Node(){}Node(LL a , LL b , LL c):num(a),sum(b),sqsum(c){}
}dp[25][8][8];Node dfs( int pos , int sumper , int val , bool limit ){   if( pos == -1 ) return Node( sumper && val , 0 , 0 );if( !limit && dp[pos][sumper][val].num != -1 ) return dp[pos][sumper][val];int up = limit ? a[pos] : 9;Node ans = Node(0,0,0);for( int i = 0 ; i <= up ; i++ ){if( i == 7 ) continue ;Node temp = dfs( pos - 1 , (sumper+i)%7 , (val*10+i)%7 , limit && i == up);  //这里就相当于于模板ans += dfs(...);只不过用了结构体要分开赋值。  ans.num = ( ans.num + temp.num ) % MOD ;                                    //与7无关的个数和ans.sum = ( ans.sum + ((c[pos]*i)%MOD*temp.num%MOD + temp.sum)%MOD )%MOD;  //与7无关的数的和//平方和式子太长分开写(加上num个数的平方和):  ans.sqsum = (ans.sqsum + ((i*c[pos]%MOD)*i%MOD*c[pos]%MOD * temp.num )%MOD )%MOD;  ans.sqsum = ( ans.sqsum + (temp.sqsum + ((2*c[pos]*i)%MOD*temp.sum)%MOD) ) % MOD; //两个共同组成与7无关的数的平方和}if( !limit ) dp[pos][sumper][val] = ans ;return ans ;
}void init(){      //c[i] = 10^i ;c[0] = 1;for( int i = 1 ; i < 20 ; i++ ){c[i] = (c[i-1]*10) % MOD ;}
}LL solve( LL x ){int tot = 0 ; while( x ){a[tot++] = x % 10 ;x /= 10;} Node ans = dfs( tot - 1 , 0 , 0 , true )  ;return ans.sqsum;
}int main(){ios_base::sync_with_stdio(false); cin.tie(0);int T;cin >> T;LL l , r ;memset(dp,-1,sizeof(dp));init();while( T-- ){cin >> l >> r ;cout << ( solve(r) - solve(l-1) + MOD ) % MOD << endl ;}return 0 ;
}

HDU 4507 吉哥系列故事――恨7不成妻 数位DP相关推荐

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

    题目链接:点击查看 题目大意:给出闭区间[l,r],求出区间内与7不沾边的数的平方和 与7有关的条件: 整数中某一位是7: 整数的每一位加起来的和是7的整数倍: 这个整数是7的整数倍: 题目分析:抛去 ...

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

    J - 吉哥系列故事――恨7不成妻 HDU - 4507 题解:数位dp 和简单的数位dp不同,这道题要算所有合法数的平方和 考虑到一个数可以写成X=ΣAi*Pi,(其中Ai为X每一位的值,Pi=10 ...

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

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

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

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

  5. HDU 4507 吉哥系列故事――恨7不成妻 (平方拆解 + *数位DP 总结)

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

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

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

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

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove Tencent马拉松初赛第二场的鬼畜题... 其实 ...

  8. HDU4507 吉哥系列故事――恨7不成妻 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题意:求[L,R](1 <= L <= R <= 10^18)区间内和7无关的 ...

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

    吉哥系列故事--恨7不成妻 ∑i=1n(pre+suc)2∑i=1npre2+suc2+2×pre×sucn×pre2+∑suc2+2×pre∑suc\sum_{i = 1} ^{n}(pre + s ...

最新文章

  1. 人体姿态和形状估计的视频推理:CVPR2020论文解析
  2. CNCC技术论坛丨联邦学习冲刺人工智能“最后一公里”!
  3. C++ typeid操作符
  4. Hadoop LZO的安装与配置
  5. java nio2 iocp_基于JDK7 NIO2的高性能web服务器实践之二(转)
  6. SAP Hybris Enterprise Commerce的一些有用链接 - 保证持续更新
  7. 空心点_空心砖的新玩法,看完大开眼界
  8. React中解决样式丢失问题
  9. Two Strings(CF-223B)
  10. Eclipse自动生成方法注释 快捷键
  11. PKCS #1 RSA Encryption Version 1.5
  12. windows server 2008 r2 安装
  13. 如何在苹果MacBook Pro上打开和使用Touch Bar Zoom?
  14. word、PDF、html、chm 文件的转换
  15. python网页编辑器-Python Jupyter 网站编辑器
  16. AI+IoT行业“飞轮效应”凸显,全球云服务能力将发挥关键作用
  17. 月薪2w的前端工程师,必盘的实战项目
  18. linux nodejs 502错误,node.js应用程序与nginx 502错误的网关错误
  19. 共探机遇 2018中国产业互联网化纤创新者大会华丽启幕
  20. SAN 光纤交换机配置远距离级联(EF)操作

热门文章

  1. 基于jsp+mysql+java+ssm驾校预约管理系统——计算机毕业设计
  2. 图片上传到七牛云存储空间
  3. 2021年漏洞整合2+检测工具
  4. 软件定义的“可靠性”到底可不可靠?信服云的ECC机制了解一下
  5. Vimium--通过键盘就能更高效快速便捷地上网
  6. JDBCTemplate奇葩问题
  7. ESP32之SPI外设概述
  8. PHP设计模式 - 门面模式(Facade)通俗易懂 / 友好示例代码
  9. 17、前端开发:CSS知识总结——过渡(transition)
  10. 易基因|一种全新的检测DNA羟甲基化的技术:ACE-Seq