$$ \def\bra#1{\mathinner{\left\langle{#1}\right|}} \def\ket#1{\mathinner{\left|{#1}\right\rangle}} \def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}} $$

◇◇ref001:Codeforces Round #506 (Div. 3) - D : Concatenated Multiples◇◇


☆問題URL

https://codeforces.com/contest/1029/problem/D

☆問題の概要

整数$n,k$と$n$個の整数が与えられる。これらの整数のうち2つを連結したもの(たとえば$123, 456$を連結すると$123456$)のうち、$k$で割り切れるものの数を出力せよ。

☆解法

例えば、$123, 456$を連結したものは$123000+456$と表せる。この2項のあまりの和が$k$または$0$になればいいので、あらかじめ$n$個の整数すべてを桁数で分類して、それぞれの桁数についてあまりをvectorで管理しておけば、$a\times 10^m$の$m$を順にみて、$k$で割り切れるようになるために後ろにつけられる数字の数を二分探索で求めることができる。

☆反省

解法はコンテスト中に思いついて実装も間に合っていたが、$10^9$を2つ連結するとlong longに収まらないことを失念しておりWAを出した。コンテスト中にバグを見つけられず終了。unsigned long longは$10^{19}$(20桁)まで入るので、それを使えばOKだった。

戻る