AtCoder ABC 129F Takahashi's Basics in Education and Learning

题目链接:https://atcoder.jp/contests/abc129/tasks/abc129_f

题目大意

  给定一个长度为 L ,首项为 A,公差为 B 的等差数列 S,将这 L 个数拼起来,记作 N,求 N % M。

分析

  设 bit(i) 为第 i 项所需要进行的十进制位移。
  则 $N = S_0 * 10^{bit(0)} + S_1 * 10^{bit(1)} + \dots + S_{L - 1} * 10^{bit(L - 1)}$。
  一项一项地算是肯定要超时的,不过注意到等差数列的每一项都小于 10 18 ,因此很多项的长度是相等的,也就是说有很多 bit(i) 也是等差数列。
  于是我们可以按照位数给等差数列分组,最多可分 18 组。
  举个例子,在区间 [L, R] 上,每一项长度都为 k。
  记这个区间上所表示的数为 A(k),A(k) 的每一项设为 $a_i, (L \leq i \leq R)$,则 $a_i = S_i * 10^{bit(i)}, A(k) = \sum_{i = L}^{R} a_i$。

代码如下

猜你喜欢

转载自www.cnblogs.com/zaq19970105/p/11100184.html