题目大意
定义函数 $f(n)$ 表示对 $n$ 一直求数位和直至 $n$ 为个位数,即:
其中 $g(n)$ 表示 $n$ 的数位和。
现在有一个很大的 $n$,你要求 $f(n)$。
这个 $n$ 是根据四个参数 $a,b,m,k$ 生成的,首先生成 $k$ 个数 $a,a+b,a+2b,\cdots,a+(k-1)b$(都在 $\bmod~m$ 意义下),然后把它们从后往前拼起来,就是 $n$。比如,$a=42,b=42,m=2018,k=18$,会生成 $n=7567146726305885465044624203783362942522101681268442$。
$0 \leq a,b \leq 10^9,\ 2 \leq m \leq 10^9+7,\ 1 \leq k \leq 10^9$
多测,$T \leq 10^4$
题解
数论技巧什么的。。还是要时常复习啊。。
首先这个 $f$ 是有通项公式的,当 $n>0$ 时 $f(n)=(n-1) \bmod 9+1$,也即 f(n)=(n%9==0) ?9 :n%9
。
所以我们就是要求 $n \bmod 9$ 的值。(特判 $n=0$)
注意到 $\forall x>0,10^x \bmod 9=1$,因此对于 $n$ 来说,多个数拼起来 $\bmod 9$ 等价于拆开来 $\bmod 9$ 再求和,即 $n \bmod 9 =\sum_{i=0}^{k-1}\big((a+bi) \bmod m \big) \bmod 9$。
注意到这个式子,是先让 $a+bi$ 模 $m$,再求和,模 $9$。这样子直接做就不好做,所以要把里面的 $\bmod~m$ 变形:
这样就变成类欧了。
代码
1 |
|