B - Exactly N points

Quiz

https://atcoder.jp/contests/cf16-final-open/tasks/codefestival_2016_final_b

Submit

https://atcoder.jp/contests/cf16-final-open/submissions/4513717

Note

  • 難しい問題ではないけれど、editorialに二分探索が書かれていないのと、解説記事Blogも書かれていないので書いておく

解法

  • n項までの和は n * (n+1) / 2
  • それがN以上であれば、n項までで作れる
  • nをどうやって見つける?二分探索
    • N以上になるn
    • N以上を作れないn
    • この境界を探す
  • nが見つかれば、大きい方から使っていけばNを作れる

計算量(おまけ)

  • N個の候補からnを見つける計算量はlog(N)
  • n * (n+1) / 2 = Nなのでn = sqrt(N)ほど
  • 長さnのforをする箇所で計算量はsqrt(N)
  • よって合計は log(N) + sqrt(N)
  • グラフ上でlog(x)とsqrt(x)ではsqrt(x)が上にくるので、O(sqrt(N))