【题目来源】
【题目描述】
一本书的页码是从 1∼n 编号的连续整数:1,2,3,⋯,n。请你求出全部页码中所有单个数字的和,例如第 123 页,它的和就是 1+2+3=6。
【输入格式】
一行一个整数 n。
【输出格式】
一行,代表所有单个数字的和。
【输入样例一】
12
【输出样例一】
51
【输入样例二】
3456789
【输出样例二】
96342015
【数据范围】
1≤n≤10^9
【算法分析】
● 本题“暴力法”代码如下所示。
由于暴力法时间复杂度达 O(nlogn),而本题问题规模达 10^9,故求解只过 4 个样例,得 40 分,其他 6 个样例 TLE。因此,可以考虑“数位DP”算法求解。
● 数位DP(Digit Dynamic Programming)是一种用于解决数字数位相关计数问题的动态规划算法。其核心思想是将数字按位拆解,通过递归或递推的方式处理每一位的选择,并利用记忆化搜索来避免重复计算,从而高效统计满足特定条件的数字数量。
● 数位DP通过记录前导零、数位限制等状态,将问题复杂度降低至 O(log n),能够处理非常大的数字范围(如 10^18)。其实现通常是将统计 [le, ri] 的问题转化为统计 [1, ri] 和 [1, le-1] 的结果相减。
● 数位DP题型的特点:求某个区间 [le, ri] 内,满足某种性质的数的个数。
● 算法分析详见:
● 洛谷 P1836:数页码()的代码,与洛谷 P2602:[ZJOI2010] 数字计数()、AcWing 338:计数问题()的代码基本一致。
【算法代码】
【参考文献】