まずは全探索を考えることにする。例えばのとき、のように昇順にの倍数かどうかチェックしたい。これはキューを使えば簡単に実現できる。整数をキューから取り出したら、とをキューに加えればよい。しかし、問題点が2つある:
- そもそも全探索は間に合わない
- 64ビット整数の範囲を容易に超えてしまう
1つ目の問題は、を法として合同な整数を2度は処理しないことで解決する。なら、だから、代表元として最小のものだけ処理していけばよい。2つ目の問題は、キューに加える整数をを取った整数とすれば解決できそうだが、そうすると元の整数がわからなくなってしまう。この制約では2進法でのようにコーディングすれば64ビットに収まるので、これとペアでキューに加えれば良いようだ。しかし、上限の評価はそんなに明らかでもない。1 単方向リストで永続スタックを作る感じにしたほうが確実だと思った。
解説にある通り、高々ビットで十分なのはすぐにわかるが…… ↩︎