G - Small Multiple 2 解説
by
sounansya
\(S\) の桁数を \(N\) とします。
\(S\) の後ろにつく整数の長さを \(k\) とする(\(10^k < K\) を仮定します)と、 \(S\) の前につける必要のある整数を \(x\) として \(-(10^k\times S+10^{N+k}\times x) \bmod K < 10^k\) が成り立つ必要があります。 \(A=-10^{N+k} \bmod K,\ B=-10^k\times S\bmod K\) とするとこの式は \((Ax+B) \bmod K < 10^k\) となり、さらにこの式は \(\displaystyle \left\lfloor \frac{Ax+B}K\right\rfloor- \left\lfloor \frac{Ax+B-10^k}K\right\rfloor=-1\) と同値です。したがって、条件を満たす最小の \(x=X\) は \(\displaystyle \sum_{x=0}^{X-1} \left( \left\lfloor \frac{Ax+B}K\right\rfloor- \left\lfloor \frac{Ax+B-10^k}K\right\rfloor\right)=0\) を満たす最大の \(X\) です。\(X\) の候補は \(K\) 未満なので、この範囲で二分探索をすることで \(O(\log^2K)\) 時間で \(X\) を求めることができます。また、Min of Mod of Linear を求めるアルゴリズムにより \(O(\log K)\) 時間でもこの \(X\) を計算することができます。(参考: [Library Checker] Min of Mod of Linear - maspyのHP)
以上を全ての \(k\) に対して計算し、その中での最小値が答えとなります。あまりが \(0\) となる場合や先頭につける整数が \(0\) である場合は \(S\) のぜんごに文字列を何も追加しないことなどに注意してください。
以上を適切に実装することでこの問題に正答することができます。計算量は \(O(|S|+\log^3K)\) または \(O(|S|+\log^2K)\) です。
投稿日時:
最終更新: