BOJ 28127 - 숫자탑과 쿼리

image.png

각 층마다 개수가 $a,a+d,a+2d+\cdots$ 처럼 증가되므로

등차수열의 합 공식인 $S_n=\dfrac{n(2a+(n-1)d)}{2}$ 임을 이용해 이분탐색으로 몇층인지와 몇번째 인지를 찾아줄 수 있다.

void solve() {
   int q;
   cin >> q;
   while (q--) {
      int a, d, x;
      cin >> a >> d >> x;

      auto check = [&](int i) {
         return x <= i * (2 * a + (i - 1) * d) / 2;
      };
      int l = 1, r = 1e6, ret = 0;
      while (l <= r) {
         int m = l + r >> 1;
         if (check(m)) ret = m, r = m - 1;
         else l = m + 1;
      }
      cout << ret << ' ' << x - (ret - 1) * (2 * a + ((ret - 1) - 1) * d) / 2 << endl;
   }
}

Tags:

Categories:

Updated:

Comments