かしのブログ

競技プログラミングとか

AtCoder Beginner Contest 129 F - Takahashi's Basics in Education and Learning

問題

初項 A、公差 B、項数 Lの数列 Sがある。 十進法で s_0, s_1, \cdots, s_{L-1}を順に結合してできる数 Xを整数 Mで割ったあまりを求める。

atcoder.jp

考察

全ての要素が k桁の整数である公差 B、長さ l等比数列 T_kについて X_kは、

 X_k = t_0 \cdot 10^{k(l-1)} + t_1 \cdot 10^{k(l-2)} + \cdots + t_{l-1} \cdot 10^0

 = (((t_0 \cdot 10^k + t_1) \cdot 10^k + t_2) \cdot 10^k + \cdots + t_{l-2}) \cdot 10^k + t_{l-1}

 Y_{n} = (t_0 \cdot 10^k + t_1) \cdot 10^k + \cdots + t_{n}とすると、  Y_{n+1} = 10^kY_{n} + t_{n+1}。 また、 t_{n+1} = t_n + Bより、

 \begin{pmatrix}
Y_{n}\\
t_n\\
1
\end{pmatrix}
=
\begin{pmatrix}
10^k&1&0\\
0&1&B\\
0&0&1
\end{pmatrix}
\begin{pmatrix}
Y_{n-1}\\
t_{n-1}\\
1
\end{pmatrix}
=
\begin{pmatrix}
10^k&1&0\\
0&1&B\\
0&0&1
\end{pmatrix}^{n}
\begin{pmatrix}
Y_{0}\\
t_{0}\\
1
\end{pmatrix}

で求められ、 X_k = Y_{l-1}。行列の塁上は繰り返し2乗法で求める。

制約より、 k =1\sim 17まで、初項 t_0と項数 lが、 A, B, Lから得られる(その桁数の項がないなら0)。  Y_0を、 k-1桁まで計算した結果として利用することで Xを求めることができる。ただし、 k = 0のときは Y_0 = 0

実装

atcoder.jp