好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
单身!依然单身!吉哥依然单身!DS 级码农吉哥依然单身!
所以,他平生最恨情人节,不管是 214 还是 77,他都讨厌!
吉哥观察了 214 和 77 这两个数,发现:
- 2+1+4=7
- 7+7=7×2
- 77=7×11
最终,他发现原来这一切归根到底都是因为和 7 有关!所以,他现在甚至讨厌一切和 7 有关的数!
什么样的数和 7 有关呢?如果一个整数符合下面三个条件之一,那么我们就说这个整数和 7 有关:
- 整数中某一位是 7;
- 整数的每一位加起来的和是 7 的整数倍;
- 这个整数是 7 的整数倍。
现在问题来了:吉哥想知道在一定区间内和 7 无关的数字的平方和。
输入格式
输入数据的第一行是测试数据组数 T,然后接下来的 T 行表示 T 组测试数据。
每组数据在一行内包含两个正整数 L,R。
输出格式
对于每组数据,请计算 [L,R] 中和 7 无关的数字的平方和,并将结果对 109+7 取模后输出。
样例
样例输入
3
1 9
10 11
17 17
样例输出
236
221
0
样例解释
第一组:[1,9],和 7 无关的数:1,2,3,4,5,6,8,9(7 本身有关,排除)。
平方和 =12+22+32+42+52+62+82+92
=1+4+9+16+25+36+64+81=236。
第二组:[10,11],
- 10:数字不含 7,和 1+0=1 不是 7 倍数,10 不是 7 倍数,所以无关;
- 11:数字不含 7,和 1+1=2 不是 7 倍数,11 不是 7 倍数,所以无关。
平方和 =102+112=100+121=221。
第三组:[17,17],
17:数字含 7,所以有关,因此平方和为 0。
数据范围
对于全部数据:
- 1≤T≤50
- 1≤L≤R≤1018
时空限制
- 时间:1000 ms
- 内存:524288 KB
提示
此题为 数位 DP 的较难题目,需要计算平方和。
条件:
- 不能包含数字 7;
- 数位和 summod7=0;
- 数值 nummod7=0。
我们需要统计满足条件的数的平方和,而不仅仅是个数。
状态设计:
设 dp[pos][sum_mod][num_mod][has7] 表示:
- pos:当前处理到的位;
- sum_mod:当前数位和模 7;
- num_mod:当前数值模 7;
- has7:是否已经出现过数字 7(一旦出现过,则整个数不合法,可以直接返回 0)。
但我们需要返回平方和,所以 DP 状态需要维护三个值:
- cnt:满足条件的数的个数;
- sum:满足条件的数的和;
- sqsum:满足条件的数的平方和。
转移:
设当前位数字为 d,从高位递归到低位。
设下一层状态为 (cnt′,sum′,sqsum′),当前位权重为 10pos(从低位到高位编号,即最低位权重 100),则当前位数字 d 对数值的贡献是 d×10pos。
合并到当前状态:
- cnt=∑cnt′
- sum=∑(sum′+cnt′×d×10pos)
- $sqsum = \sum [sqsum' + 2 \times d \times 10^{pos} \times sum' + cnt' \times (d \times 10^{pos})^2]$
模运算:在计算过程中,所有模数取 109+7,但 sum_mod 和 num_mod 的模数为 7(用于条件判断)。
限制条件:
- 如果 has7 为真,则当前数已不合法,直接返回 (0,0,0);
- 如果 d=7,则下一层的 has7 为真;
- 最终在 pos=0 时,若 sum_mod=0 且 num_mod=0,则返回 (1,0,0)(因为此时数值为 0,但会在递归中累加),否则返回 (0,0,0)。
最终答案为 sqsummod(109+7)。
复杂度:状态数 O(18×7×7×2),可以接受。