#sWDPybttg050306. 1590:恨 7 不成妻

1590:恨 7 不成妻

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

单身!依然单身!吉哥依然单身!DS 级码农吉哥依然单身!

所以,他平生最恨情人节,不管是 214214 还是 7777,他都讨厌!

吉哥观察了 2142147777 这两个数,发现:

  • 2+1+4=72+1+4=7
  • 7+7=7×27+7=7\times 2
  • 77=7×1177=7\times 11

最终,他发现原来这一切归根到底都是因为和 77 有关!所以,他现在甚至讨厌一切和 77 有关的数!

什么样的数和 77 有关呢?如果一个整数符合下面三个条件之一,那么我们就说这个整数和 77 有关:

  1. 整数中某一位是 77
  2. 整数的每一位加起来的和是 77 的整数倍;
  3. 这个整数是 77 的整数倍。

现在问题来了:吉哥想知道在一定区间内和 77 无关的数字的平方和。


输入格式

输入数据的第一行是测试数据组数 TT,然后接下来的 TT 行表示 TT 组测试数据。

每组数据在一行内包含两个正整数 L,RL, R


输出格式

对于每组数据,请计算 [L,R][L,R] 中和 77 无关的数字的平方和,并将结果对 109+710^9+7 取模后输出。


样例

样例输入

3
1 9
10 11
17 17

样例输出

236
221
0

样例解释

第一组:[1,9][1,9],和 77 无关的数:1,2,3,4,5,6,8,91,2,3,4,5,6,8,977 本身有关,排除)。
平方和 =12+22+32+42+52+62+82+92= 1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 8^2 + 9^2
=1+4+9+16+25+36+64+81=236= 1+4+9+16+25+36+64+81 = 236

第二组:[10,11][10,11]

  • 1010:数字不含 77,和 1+0=11+0=1 不是 77 倍数,1010 不是 77 倍数,所以无关;
  • 1111:数字不含 77,和 1+1=21+1=2 不是 77 倍数,1111 不是 77 倍数,所以无关。
    平方和 =102+112=100+121=221= 10^2 + 11^2 = 100 + 121 = 221

第三组:[17,17][17,17]
1717:数字含 77,所以有关,因此平方和为 00


数据范围

对于全部数据:

  • 1T501 \le T \le 50
  • 1LR10181 \le L \le R \le 10^{18}

时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
此题为 数位 DP 的较难题目,需要计算平方和。

条件:

  1. 不能包含数字 77
  2. 数位和 summod70sum \bmod 7 \neq 0
  3. 数值 nummod70num \bmod 7 \neq 0

我们需要统计满足条件的数的平方和,而不仅仅是个数。

状态设计: 设 dp[pos][sum_mod][num_mod][has7]dp[pos][sum\_mod][num\_mod][has7] 表示:

  • pospos:当前处理到的位;
  • sum_modsum\_mod:当前数位和模 77
  • num_modnum\_mod:当前数值模 77
  • has7has7:是否已经出现过数字 77(一旦出现过,则整个数不合法,可以直接返回 0)。

但我们需要返回平方和,所以 DP 状态需要维护三个值:

  • cntcnt:满足条件的数的个数;
  • sumsum:满足条件的数的和;
  • sqsumsqsum:满足条件的数的平方和。

转移
设当前位数字为 dd,从高位递归到低位。
设下一层状态为 (cnt,sum,sqsum)(cnt', sum', sqsum'),当前位权重为 10pos10^{pos}(从低位到高位编号,即最低位权重 10010^0),则当前位数字 dd 对数值的贡献是 d×10posd \times 10^{pos}

合并到当前状态:

  • cnt=cntcnt = \sum cnt'
  • sum=(sum+cnt×d×10pos)sum = \sum (sum' + cnt' \times d \times 10^{pos})
  • $sqsum = \sum [sqsum' + 2 \times d \times 10^{pos} \times sum' + cnt' \times (d \times 10^{pos})^2]$

模运算:在计算过程中,所有模数取 109+710^9+7,但 sum_modsum\_modnum_modnum\_mod 的模数为 77(用于条件判断)。

限制条件

  • 如果 has7has7 为真,则当前数已不合法,直接返回 (0,0,0)(0,0,0)
  • 如果 d=7d = 7,则下一层的 has7has7 为真;
  • 最终在 pos=0pos=0 时,若 sum_mod0sum\_mod \neq 0num_mod0num\_mod \neq 0,则返回 (1,0,0)(1,0,0)(因为此时数值为 0,但会在递归中累加),否则返回 (0,0,0)(0,0,0)

最终答案为 sqsummod(109+7)sqsum \bmod (10^9+7)

复杂度:状态数 O(18×7×7×2)O(18 \times 7 \times 7 \times 2),可以接受。