#76. 位数阶层

位数阶层

位数阶层

题目背景

Y 同学在研究数字的“阶层”特性时,发明了一个有趣的函数 f(x)f(x)。他认为,一个数 xx 在其所属的“位数阶层”(例如所有三位数构成的阶层)中的排名,可以反映其相对大小。他将这个排名定义为 f(x)f(x),并对这个函数的前缀和产生了浓厚的兴趣。

题目描述

我们定义一个函数 f(x)f(x),其值为所有不大于 xx 且与 xx十进制位数相同的正整数的个数。

例如:

  • f(7)f(7): 与 77 位数相同的正整数是 1,2,,91, 2, \dots, 9。其中不大于 77 的有 1,2,,71, 2, \dots, 7,共 77 个,所以 f(7)=7f(7)=7
  • f(13)f(13): 与 1313 位数相同的正整数是 10,11,,9910, 11, \dots, 99。其中不大于 1313 的有 10,11,12,1310, 11, 12, 13,共 44 个,所以 f(13)=4f(13)=4
  • 更一般地,如果 xx 是一个 dd 位数,那么 f(x)=x10d1+1f(x) = x - 10^{d-1} + 1

给定一个正整数 NN,你的任务是计算 i=1Nf(i)\sum_{i=1}^{N} f(i) 的值。

由于答案可能非常大,请输出结果对 998244353998244353 取模。

输入格式

输入一行,包含一个正整数 NN

输出格式

输出一个整数,表示 $\left( \sum_{i=1}^{N} f(i) \right) \pmod{998244353}$ 的值。

样例

样例输入 #1

16

样例输出 #1

73

样例输入 #2

238

样例输出 #2

13870

样例输入 #3

999999999999999999

样例输出 #3

762062362

提示

样例 1 解释

  • 对于 1x91 \le x \le 9(一位数),f(x)=xf(x) = x
    • 这部分的和为 i=19i=45\sum_{i=1}^{9} i = 45
  • 对于 10x1610 \le x \le 16(两位数),f(x)=x10+1=x9f(x) = x - 10 + 1 = x-9
    • 这部分的和为 $\sum_{i=10}^{16} (i-9) = (10-9) + (11-9) + \dots + (16-9) = 1+2+\dots+7 = 28$。

总和为 45+28=7345 + 28 = 73

数据范围与约定

  • 对于 100%100\% 的数据,1N<10181 \le N < 10^{18}
  • 请注意,NN 的值会超过 32 位整型(int)的范围,需要使用 64 位整型(在 C++ 中为 long long)来存储。