HDU4507 吉哥系列故事――恨7不成妻
来源:互联网 发布:手机屏幕镜像软件 编辑:程序博客网 时间:2024/06/07 03:42
单身!
依然单身!
吉哥依然单身!
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无关的数字的平方和。
依然单身!
吉哥依然单身!
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无关的数字的平方和。
31 910 1117 17
2362210
思路
主要是这个思路啊,一开始想的类似数位dp那样,保存一个当前数取模之后的一个数。然后最后返回这个数的平方。然而比标准答案总是多搜出来一部分。题目dp思路很好想,但麻烦的地方在于其要求的值是符合条件的树的平方和。
我们用pra记录前面位的数字和%7,prb记录前面位的数字的值%7。加上遍历时对7的筛除,我们很容易可以找出与7无关的数,但是怎样求平方和呢?我们用三个变量
cnt表示当前状态下的与7无关的数的个数,在搜索的过程中很容易得到
sum表示当前状态下的与7无关的数的合
那么newsum = i*10^len*cnt + sum(i是当前选取的数,用cnt个加上cnt个数的和即sum,便是新的数的和)
sqsum表示当前状态下与7无关的数的平方和
(i*10^len + num)^2 = (i*10^len)^2 + 2*i*10^len*num + num^2;
而cnt个数的平方和就是
(i*10^len)^2*cnt + SUM(num^2) + 2*i*10^len*SUM(num)
即(i*10^len)^2*cnt + sqsum + 2*i*10^len*sum。
这样的话其实dp值里面存的就不是数的个数了,而是这些数的平方和。然而这样其实缺少一个状态,那就是当前数模1e9加7之后的数是多少,不过很明显我们是不可能开出这么大的一个数组的。于是便去看了一下别人是怎么解的。
感觉完全想不出来啊,好难。。。。。。
找了一个比较详细且比较好理解的搬了过来。
#include <cstdio>#include <cstring>using namespace std;typedef long long LL;const LL mod = 1e9+7;LL l,r;LL p[20];struct node{ LL cnt = -1; LL sum; LL sqsum; node(LL a, LL b, LL c) { cnt = a; sum = b; sqsum = c; } node(){};}dp[20][7][7];int digit[20];node dfs(int len,int sum1,int sum2,bool up){ if(len == -1) { return node(sum1 && sum2,0,0); } if(!up && dp[len][sum1][sum2].cnt != -1)return dp[len][sum1][sum2]; node temp,ans(0,0,0); int n = up?digit[len] : 9; for(int i = 0 ; i <= n ; ++i) { if(i == 7)continue; temp = dfs(len - 1,(sum1+i)%7,(sum2*10+i)%7,up && i==n); ans.cnt = (ans.cnt + temp.cnt)%mod; ans.sum += (temp.sum + p[len]*i%mod*temp.cnt%mod)%mod; ans.sum %= mod; ans.sqsum += (temp.sqsum + ((2*p[len]*i)%mod)*temp.sum)%mod; ans.sqsum %= mod; ans.sqsum += ( (temp.cnt*p[len]) %mod*p[len]%mod*i*i%mod ); ans.sqsum %= mod; } if(!up)dp[len][sum1][sum2] = ans; return ans;}LL cal(LL x){ int len = 0; while(x) { digit[len++] = x % 10; x /= 10; } return dfs(len-1,0,0,1).sqsum;}int main(){ int t; scanf("%d",&t); p[0] = 1; for(int i = 1 ; i < 20 ; ++i)p[i] = (p[i-1]*10)%mod; for(int tt = 1 ; tt <= t ; ++tt) { scanf("%I64d%I64d",&l,&r); printf("%I64d\n",(cal(r) - cal(l-1) + mod) % mod); } return 0;}
阅读全文
1 0
- HDU4507 吉哥系列故事――恨7不成妻 数位DP
- HDU4507 吉哥系列故事――恨7不成妻
- HDU4507吉哥系列故事――恨7不成妻
- 吉哥系列故事——恨7不成妻 hdu4507
- hdu4507 吉哥系列故事——恨7不成妻
- hdu4507 吉哥系列故事——恨7不成妻 数位DP
- hdu4507吉哥系列故事——恨7不成妻 数位dp
- HDU4507 吉哥系列故事——恨7不成妻
- 【HDU4507】【吉哥系列故事——恨7不成妻】【变形数位dp】
- hdu4507吉哥系列故事——恨7不成妻 (数位dp)
- HDU4507吉哥系列故事——恨7不成妻(数位dp)
- [数位DP] HDU4507 吉哥系列故事——恨7不成妻
- 【数位DP】HDU4507[吉哥系列故事——恨7不成妻]题解
- HDU - 4507 吉哥系列故事――恨7不成妻 (数位DP)
- hdu 4507 吉哥系列故事――恨7不成妻 数位dp
- HDU 4507 —— 吉哥系列故事――恨7不成妻
- hdu 4507 吉哥系列故事――恨7不成妻 数位dp
- HDU-4507 吉哥系列故事――恨7不成妻 (数位dp)
- 617. Merge Two Binary Trees
- 基于JAVA的图书管理系统(jsp+mysql+tomcat)
- JQuery 输入文本框 简单事件
- 全面理解Java内存模型
- Python探索记(09)——字符串(上)
- HDU4507 吉哥系列故事――恨7不成妻
- 洛谷P3003 [USACO10DEC]苹果交货Apple Delivery
- 记2017—春招,令人难忘的面试经历
- longest Substring Without Repeating Characters
- OpenCV 根据对应的三维点估计刚体变换的旋转平移矩阵(RT矩阵)
- 浅析TCP协议中的各种定时器
- Unit iptables.service failed to load
- (带讲解)bzoj 4830 抛硬币 组合式推导+拓展lucas
- Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x000001DB1D7557