Codeforces Round #506 (Div. 3)D. Concatenated Multiples
問題概要
数字 と の連結を, 文字列として と を連結したときにできる数とする. たとえば と の連結は である.
長さ の数列 と が与えられる. このうち, と ( ) の連結が で割り切れるような順序付きペア の個数を求めよ.
制約
解法
と の連結が で割り切れるには, の桁数を として が満たされている必要があります. これを数え上げることにしましょう.
を固定したとき, を満たすものを数えます. 左辺に に依存する値が入っていて厄介ですが, は高々 通りの値しかとらないので, (桁数が で, で割った余りが ) の個数をあらかじめ計算しておけば数え上げることができます( を数え上げるのに注意してください).
(桁数が で, で割った余りが ) の個数はどう管理しましょうか?僕は普通に std::map で管理していましたが, std::map は定数倍が重く TLE するようです. 配列を用意し, 二分探索で個数を計算することにしましょう. これは, 座圧などでも言える話です.
なお, である必要があるので, この部分は考慮してコードを書く必要はあります.