Description
题目链接:BZOJ 2326
小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:
给定正整数 $n$ 和 $m$,要求计算 $\text{Concatenate}(1\dots n)\bmod m$ 的值,其中 $\text{Concatenate}(1\dots n)$ 是将所有正整数 $1,2,\dots,n$ 顺序连接起来得到的数。小 C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题。
数据范围:$1\le n\le 10^{18}$,$1\le m\le 10^9$
Solution
我们设前 $i$ 个数的答案为 $f_i$,那么可以列出如下转移方程:
发现第 $i$ 项之和第 $i-1$ 项有关,可以考虑矩阵快速幂优化递推。
转移矩阵为:
但是我们发现,指数 $k$ 的值为 $\left\lfloor\log_{10}i\right\rfloor+1$(也就是 $len(i)$)的值是会变化的,没法直接矩乘。由于 $len(i)$ 的值一共只有 $18$ 种左右,所以我们直接枚举 $len(i)$ 然后分块矩乘后合并。
注意:合并时,必须用转移矩阵的若干次方左乘答案矩阵!
时间复杂度:$O(3^3\log^2 n)$
Code
1 |
|