hitoare日記

たまに書きます

F - Division or Substraction (AtCoder Beginner Contest 161)

問題リンク

atcoder.jp


問題概要

正整数Nが与えられる、2以上N以下の整数Kを選んで次の操作を行う。

  • NがKで割り切れるならば、NをN/Kで置き換える。
  • 割り切れなければ、NをN-Kで置き換える。
  • NがK未満になったら終了する。

最終的なNの値が1になるKはいくつあるか。

制約:\(2 \leqq N \leqq 10^{12}\)

解法

Kの条件を式で表すと、

\(N = (aK+1)K^b\)

となる非負整数a,bが存在することと同値である。

Nが最大\(10^{12}\)と大きいため、愚直に全探索するのは難しいが、

Kが\(\sqrt{N}\)より大きい時、NはKで2回以上割れない、したがってbは2以上にはならないことを利用する。

(\(\sqrt{N}\)を境目として探索方法や遷移式を変えるテクニックはたまに使う。問題 問題(ネタバレ注意))

今回の場合は\(K \geqq \sqrt{N}\)とすると\(b=0,1\)なので

\(N = aK+1\)

もしくは

\(N=(aK+1)K=aK^2+K\)

となる、後者は\(K^2 \geqq N\)より\(a=0\)、よって\(N=K\)となる。

前者の場合は\(K=(N-1)/a\)となるので、候補はN-1の約数のみとなる。

このなかで\(\sqrt{N}\)より大きいものを全て列挙すれば良い。

あとは\(\sqrt{N}\)より小さいものに関して愚直に全探索すれば答えが得られる。

(追記:\(b > 0\)の時はKがNの約数なので、Nの約数について調べるだけでよい、という方法で解いている人が多いみたいです。解説もそうしています)

提出

https://atcoder.jp/contests/abc161/submissions/11523694

感想

自己最高順位。