数位DP恨7不成妻
Posted lglh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数位DP恨7不成妻相关的知识,希望对你有一定的参考价值。
【数位DP】恨7不成妻
时间限制: 1 Sec 内存限制: 128 MB提交: 8 解决: 4
[提交] [状态] [命题人:admin]
题目描述
单身!
依然单身!
吉哥依然单身!
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无关的数字的平方和。
输入
输入数据的第一行是case数T(1 <= T <= 50),然后接下来的T行表示T个case;每个case在一行内包含两个正整数L, R(1 <= L <= R <= 10^18)。
输出
请计算[L,R]中和7无关的数字的平方和,并将结果对10^9 + 7 求模后输出。
样例输入
3
1 9
10 11
17 17
样例输出
236 221 0 题解:https://blog.csdn.net/zxyoi_dreamer/article/details/82897281
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll mod=1e9+7; 5 ll l,r,decimal[25],a[25]; 6 struct node 7 8 ll sum0,sum1,sum2; 9 node():sum0(0),sum1(0),sum2(0) 10 dp[25][10][10]; 11 node dfs(int pos,int addremain,int numremain,bool limit) 12 13 if(pos==0) 14 15 node cnt; 16 if(addremain && numremain) cnt.sum0=1; 17 return cnt; 18 19 if(dp[pos][addremain][numremain].sum0 && !limit) return dp[pos][addremain][numremain]; 20 node res; 21 ll up=limit?a[pos]:9; 22 for(ll i=0;i<=up;i++) 23 24 if(i==7) continue; 25 node tmp=dfs(pos-1,(addremain+i)%7,(numremain*10+i)%7,i==a[pos]&&limit); 26 res.sum0=(res.sum0+tmp.sum0)%mod; 27 res.sum1=(res.sum1+tmp.sum1+decimal[pos-1]*i%mod*tmp.sum0%mod)%mod; 28 res.sum2=(res.sum2+tmp.sum2+2*i%mod*decimal[pos-1]%mod*tmp.sum1%mod 29 +i*i%mod*decimal[pos-1]%mod*decimal[pos-1]%mod*tmp.sum0%mod)%mod; 30 31 if(!limit) dp[pos][addremain][numremain]=res; 32 return res; 33 34 ll solve(ll val) 35 36 int len=0; 37 while(val) 38 39 a[++len]=val%10; 40 val/=10; 41 42 return dfs(len,0,0,true).sum2; 43 44 int main() 45 46 decimal[0]=1; 47 for(int i=1;i<=20;i++) decimal[i]=decimal[i-1]*10%mod; 48 int t; 49 for(scanf("%d",&t);t;t--) 50 51 scanf("%lld %lld",&l,&r); 52 printf("%lld\n",(solve(r)-solve(l-1)+mod)%mod); 53 54 return 0; 55 56 //1 1000000000000000000
以上是关于数位DP恨7不成妻的主要内容,如果未能解决你的问题,请参考以下文章
HDU 4507 吉哥系列故事――恨7不成妻(数位dp&好魔性的一道好题)