公式

A - Swap Digit 解説 by PCTprobability


便利のため、\(0 \le i \le N-1\) に対して \(A\)\(10^i\) の位の数字と \(B\)\(10^i\) の位の数字は異なるものとします。

\(A\)\(10^i\) の桁の数字を \(a_i\)\(B\)\(10^i\) の桁の数字を \(b_i\) とします。すると、

\(\begin{aligned} A \times B &= \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} a_ib_j10^{i+j} \\ &= \sum_{i=0}^{N-1} a_ib_i10^{2i} + \sum_{i=0}^{N-1} \sum_{j=i+1}^{N-1} (a_ib_j+a_jb_i) 10^{i+j} \end{aligned}\)

が成り立ちます。\(\sum_{i=0}^{N-1} a_ib_i10^{2i}\) の値はどのように操作をしても変わることはありません。目標は \(\sum_{i=0}^{N-1} \sum_{j=i+1}^{N-1} (a_ib_j+a_jb_i) 10^{i+j}\) を最小化させることです。

ここで、\(a_ib_j+a_jb_i\)\(a_ib_i + a_jb_j\) のどちらが小さいかを考えます。これは、\(a_i,a_j\) の大小関係と \(b_i,b_j\) の大小関係が一致しているのであれば前者、そうでないならば後者となります。

証明 $\begin{aligned} (a_ib_j+a_jb_i) - (a_ib_i + a_jb_j) &= a_i(b_j-b_i)+a_j(b_i-b_j) \\ &= (a_j-a_i)(b_i-b_j) \end{aligned}$

より、$a_i-a_j,b_i-b_j$ の正負が一致しているならば $a_ib_j + a_jb_i < a_ib_i + a_jb_j$ であり、そうでないならば $a_ib_j + a_jb_i > a_ib_i + a_jb_j$ です。

よって、\(a_i,b_i\) のうち小さい方を \(a_i\) にし、大きい方を \(b_i\) にすることによって \(A \times B\) を最小化できます。

あとは、\(\sum_{i=0}^{N-1} a_i10^i\)\(\sum_{i=0}^{N-1} b_i10^i\)\(998244353\) で割ったあまりを求め、その積を求めることでこの問題を \(\mathrm{O}(N)\) で解くことが出来ます

投稿日時:
最終更新: