๊ณจ๋“œ4 : ์ด๋ถ„ ํƒ์ƒ‰ ๋ฌธ์ œ์ด๋‹ค.

์ƒ๊ฐ

์–ด๋ ค์› ๋‹ค. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฐ์—ด์ด ์„ž์ด๊ณ , ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ๋ฐฐ์šด ๊ฒƒ์€, ์ •๋ง ์ปดํ“จํ„ฐ์ฒ˜๋Ÿผ(์„ผ๋‹ค..) ์ƒ๊ฐํ•ด์•ผ ๋œ๋‹ค๋Š” ๊ฒƒ.. ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์‹œ๋ฅผ ๋†“๊ณ , ์ด๊ฒƒ์„ ์‹ค์ œ๋กœ ์จ๋ณด๋ฉด์„œ ์ด์ƒ์ ์œผ๋กœ ํ’€ ์ƒ๊ฐ์„ ํ•˜์ง€๋ง๊ณ  try & modify ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋„ˆ๋ฌด ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋Š๊ผˆ๋‹ค..

๊ทธ๋ž˜์„œ, ์ง€๊ธˆ๋ถ€ํ„ฐ ์จ๋ณด๊ฒ ๋‹ค. ์ด ๋ฌธ์ œ์—์„œ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์ ์€ ํฌ๊ฒŒ 2๊ฐ€์ง€ ์ด๋‹ค.

์„ผ๋‹ค.

์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ํ’€๋ฆฐ๋‹ค๋Š” ๊ฒƒ์€ ์•Œ์•˜์œผ๋‚˜, K๋ฒˆ์งธ ์ˆ˜๊ฐ€ N์ด๋ผ๊ณ  ์ œ์•ˆํ•œ ์ดํ›„์—, ์–ด๋–ป๊ฒŒ K๋ฒˆ์งธ ์ˆ˜์ธ์ง€๋ฅผ ๋„์ถœํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ๋งŽ์•˜๋‹ค. ์ฆ‰, ์ œ์•ˆํ•œ ์ˆซ์ž์— ๋Œ€ํ•ด ์ด ์ˆซ์ž๊ฐ€ ๋ช‡๋ฒˆ์งธ ์ˆ˜์ธ์ง€๋ฅผ output์œผ๋กœ ๋‚ด๋†“์„ ํ•จ์ˆ˜๋ฅผ ์งœ์•ผํ•œ๋‹ค. ์ฒ˜์Œ์— ์ด๊ฒƒ์€, ์ œ์•ˆํ•œ ์ˆซ์ž์— ๋Œ€ํ•œ ์ œ๊ณฑ์ˆ˜๋ฅผ ์ฐพ์•„ ํ•„์š”์—†๋Š” ์ˆ˜๋ฅผ ์ œ๋ผ๊ณ ..์ด๋Ÿฐ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ปดํ“จํ„ฐ๋Š” ์ •๋ง ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

   1   2   3   4   5   6   7   8   9  10
   2   4   6   8  10  12  14  16  18  20
   3   6   9  12  15  18  21  24  27  30
   4   8  12  16  20  24  28  32  36  40
   5  10  15  20  25  30  35  40  45  50
   6  12  18  24  30  36  42  48  54  60
   7  14  21  28  35  42  49  56  63  70
   8  16  24  32  40  48  56  64  72  80
   9  18  27  36  45  54  63  72  81  90
  10  20  30  40  50  60  70  80  90 100

๋‚ด๊ฐ€ ๋งŒ์•ฝ, 25๋ผ๋Š” ์ˆซ์ž๋ฅผ ์ œ์•ˆํ–ˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋ ‡๋‹ค๋ฉด, 1๋ฒˆ์งธ ํ–‰์—์„œ ๋ถ€ํ„ฐ, ์ด ์ˆซ์ž๋ณด๋‹ค ์ž‘์€ ๊ฒƒ์ด ๋ช‡๊ฐœ์žˆ๋Š” ์ง€๋ฅผ ์„ผ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด 10์ด๋‹ค. 3๋ฒˆ์งธ ์—ด์—์„œ๋Š” 8์ด๋‹ค. ์ด ์ˆซ์ž๋“ค์€, i๋ฒˆ์งธ ํ–‰์˜ ์ˆซ์ž๋กœ ์ œ์‹œํ•œ ์ˆซ์ž๋ฅผ ๋‚˜๋ˆˆ ๋ชซ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ์‰ฌ์šด ์ด์œ ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ์ˆซ์ž์˜ ๋ฒˆ์งธ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ์— ๊ฐ€๋Šฅํ•˜๋‹ค.

ll f(ll num){
    ll count = 0, numbering, current = 0;
    for (int i = 1; i <= N; i++) {
        if (num/i > N) {
            numbering = N;
            current = i * N;
        } else {
            numbering = num/i;
            current = num/i * i;
        }
        count += numbering;
    }
    return count;
}

์ด ๊ณผ์ •์„ N์ด 3์ผ ๋•Œ ์ •๋ฆฌํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 1 2 3
 2 4 6
 3 6 9

 ์ œ์‹œํ•˜๋Š” ์ˆซ์ž : 1 2 3 4 5 6 7 8 9
 count      : 1 3 5 6 6 8 8 8 9

์–ด๋–ค ๊ฒƒ์ด ๋‹ต์ธ๊ฐ€?

 1 2 3
 2 4 6
 3 6 9

 ์ œ์‹œํ•˜๋Š” ์ˆซ์ž : 1 2 3 4 5 6 7 8 9
 count ํ•จ์ˆ˜  : 1 3 5 6 6 8 8 8 9

 B[]        : 1 2 2 3 3 4 6 6 9
 ๋ฒˆ์งธ ์ˆ˜      : 1 2 3 4 5 6 7 8 9

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์กฐ๊ธˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์›ํ•˜๋Š” K๊ฐ€ 8, ์ฆ‰ 8๋ฒˆ์งธ ์ˆ˜๋ผ๋ฉด 7์„ ์ œ์•ˆํ•ด๋„ 8, 6์„ ์ œ์•ˆํ•ด๋„ 8, 8์„ ์ œ์•ˆํ•ด๋„ 8์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, 7์„ ์ œ์•ˆํ•˜๋ฉด A๋ฐฐ์—ด์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ต์ด ์•„๋‹ˆ๋‹ค. ๋˜ํ•œ, K๊ฐ€ 7์ผ ๊ฒฝ์šฐ, countํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผ์‹œ์ผœ ๋‚˜์˜จ ๋ฆฌํ„ด ๊ฐ’์—๋Š” 7์ด ์—†๋‹ค. ํ•˜์ง€๋งŒ 7๋ฒˆ์งธ ์ˆ˜๋Š” ๋ถ„๋ช…ํžˆ ์กด์žฌํ•œ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ˆซ์ž๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ๋‚˜์—ด๋œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํŠน์ • ์ˆซ์ž์— ๋Œ€ํ•œ ๋ฒˆ์งธ๋งŒ์ด ์กด์žฌํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•˜๋ฉด 6์ด๋ผ๋Š” ์ˆซ์ž๋Š” ์‹ค์ œ B๋ฐฐ์—ด์—์„œ 7๋ฒˆ์งธ, 8๋ฒˆ์งธ ์ˆซ์ž์ด์ง€๋งŒ, 7์ด๋ผ๋Š” ์ˆซ์ž๋Š” A๋ฐฐ์—ด์— ์—†๊ธฐ ๋•Œ๋ฌธ์— N๋ฒˆ์งธ ์ˆซ์ž๋ผ๋Š” ๊ฐœ๋… ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค. ์ฆ‰, 7์ด๋ผ๋Š” ์ˆซ์ž๋ฅผ ์ œ์•ˆํ–ˆ์„ ๋•Œ, A๋ฐฐ์—ด์—์„œ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ˆซ์ž๋ฅผ ์„ธ๋ฉด, 6์„ ์„ธ์—ˆ์„ ๋•Œ์™€ ๊ฐ™์€ count๊ฐ€ ๋‚˜์˜ค๋‚˜, 7์ด๋ผ๋Š” ์ˆซ์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ต์ด ์•„๋‹ˆ๋‹ค.

์ˆซ์ž์˜ ๋ฒ”์œ„ ๋•Œ๋ฌธ์—, ๋‹ต์„ ์ œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธด ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ A๋ฐฐ์—ด์— ์žˆ์œผ๋ฉด์„œ, ์›ํ•˜๋Š” K๋ฒˆ์งธ๊ฐ€ ์žˆ๋Š” ์ˆ˜๋ฅผ ์ œ์‹œํ•  ์ˆ˜ ์žˆ์„๊นŒ?

K๋ณด๋‹ค count๊ฐ€ ํฐ ๋…€์„์€ ๋‹ต์˜ ํ›„๋ณด์ด๋‹ค.

์ด๊ฒƒ์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ, ์ผ๋‹จ ์ด๋ถ„ ํƒ์ƒ‰์ด ๋งž๋‹คํ•˜๊ณ  ์ƒ๊ฐ์„ ํ•ด๋ณด์ž.

1 2 3
2 4 6
3 6 9

K = 7

์ œ์‹œํ•˜๋Š” ์ˆซ์ž : 1 2 3 4 5 6 7 8 9
count ํ•จ์ˆ˜  : 1 3 5 6 6 8 8 8 9

B[]        : 1 2 2 3 3 4 6 6 9
๋ฒˆ์งธ ์ˆ˜      : 1 2 3 4 5 6 7 8 9

start : 1  end : 9  ์ œ์‹œ : 5
start : 6  end : 9  ์ œ์‹œ : 7
start : 6  end : 6  ์ œ์‹œ : 6

K = 7์ธ ์ƒํ™ฉ์—์„œ ์ƒ๊ฐํ•ด๋ณด์ž. ๋จผ์ € (1+9)/2 = 5๋ฅผ ์ œ์•ˆํ•œ๋‹ค. ์ด ๋•Œ์˜ ํ•จ์ˆ˜ ํ†ต๊ณผ ๊ฐ’์€ 6์ด๋ฏ€๋กœ, K๋ณด๋‹ค ์ž‘๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ’์„ ์˜ฌ๋ ค ์ œ์•ˆํ•œ๋‹ค.

์ด๋ฒˆ์—” (6+9)/2 = 7์„ ์ œ์•ˆํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ ํ•จ์ˆ˜ ํ†ต๊ณผ ๊ฐ’์€ 8์ด๋‹ค. K๋ณด๋‹ค ์ž‘๋‹ค. ๋”ฐ๋ผ์„œ ์ œ์‹œํ•˜๋Š” ๊ฐ’์„ ๋‚ฎ์ถ˜๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ (6+6)/2 = 6๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ count๋Š” 8์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ L, R๊ฐ€ ์—ญ์ „๋˜๋ฏ€๋กœ ๋๋‚œ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ต์€ ์ฐพ์•˜๋‹ค. 6์ด๋‹ค.

์ฆ‰, count๊ฐ€ ๊ตณ์ด K์™€ ๊ฐ™์ง€ ์•Š๋”๋ผ๋„ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ถ€๋ถ„์„ ์ž˜ ์ƒ๊ฐํ•ด๋ณด์ž.
7์„ ์„ธ์—ˆ์„ ๋•Œ์™€ 6์„ ์„ธ์—ˆ์„ ๋•Œ, ๊ฐ™์€ ๋ฒˆ์งธ ์ˆ˜(8)๋ผ๋Š” ๊ฒฐ๋ก ์ด ๋‚˜์˜ค๋‚˜, ์šฐ๋ฆฌ๋Š” 8์ด๋ผ๋Š” ์ˆซ์ž๊ฐ€ ์ฒ˜์Œ ๋“ฑ์žฅํ•˜๋Š” ์ˆซ์ž๋ฅผ ๋‹ต์œผ๋กœ ์ œ์•ˆํ•ด์•ผ ํ•œ๋‹ค. 7์„ ์ œ์•ˆํ–ˆ์„ ๋•Œ, 8์ด ๋‚˜์˜ค๋Š” ์ด์œ ๋Š”, 7์ด๋ผ๋Š” ์ˆซ์ž๊ฐ€ A๋ฐฐ์—ด์— ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์‹ค์ œ๋กœ ์žˆ๋Š” ์ˆ˜๋Š”, countํ•จ์ˆ˜๋ฅผ ๋Œ๋ ธ์„ ๋•Œ, ์ฒ˜์Œ์œผ๋กœ 8์ด๋ผ๋Š” ์ˆซ์ž๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ์ˆซ์ž๋ฅผ A๋ฐฐ์—ด์— ์žˆ๋Š” ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. (์ž˜ ์ƒ๊ฐํ•ด๋ณด์ž.) ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” ์ด๋ถ„ ํƒ์ƒ‰์˜ ๋ถ„๊ธฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •ํ•ด์•ผ ํ•œ๋‹ค.

  1. count๊ฐ€ K๋ณด๋‹ค ์ž‘๋‹ค.
    • ์ด ๊ตฌ๊ฐ„์—๋Š” ๋‹ต์ด ์กด์žฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋” ํฐ ๊ฐ’์„ ํƒ์ƒ‰ํ•œ๋‹ค.
  2. count๊ฐ€ K๋ณด๋‹ค ํฌ๋‹ค.
    • ์ด ๊ตฌ๊ฐ„์—๋Š” ๋‹ต์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋•Œ ์ œ์‹œํ•œ ๊ฐ’์€ ๋‹ต์˜ ํ›„๋ณด๋กœ ์ฑ„ํƒํ•œ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ , count๊ฐ€ K์™€ ๊ฐ™์€ ๊ตฌ๊ฐ„์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋” ์ž‘์€ ๊ฐ’์„ ํƒ์ƒ‰ํ•œ๋‹ค.

์ด ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋˜๋ฉด์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ๊ณผ์ •์€, ์ตœ๋Œ€ํ•œ K์™€ ๊ฐ™์€ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๊ณง, ๊ฐ™์€ count๊ฐ’์ด ๋‚˜์˜ค๋”๋ผ๋„, ๊ทธ ๊ฐ™์€ count๊ฐ’์ด ์ฒ˜์Œ์œผ๋กœ ๋“ฑ์žฅํ•˜๋Š” ์ˆ˜๋ฅผ ๋‹ต์œผ๋กœ ์ฑ„ํƒํ•œ๋‹ค. ๋ผ๋Š” ์˜๋ฏธ์™€ ์ผ์น˜ํ•œ๋‹ค.

Code

#include<iostream>
#include<vector>
#include<algorithm>
#include<list>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<queue>
#include<functional>
 
using namespace std;
typedef long long ll;
ll MAX_NUM = 10000000000;
ll N, K;
 
ll f(ll num){
    ll count = 0, numbering, current = 0;
    for (int i = 1; i <= N; i++) {
        if (num/i > N) {
            numbering = N;
            current = i * N;
        } else {
            numbering = num/i;
            current = num/i * i;
        }
        count += numbering;
    }
    return count;
}
 
int main(){
    cin >> N >> K;
 
    ll ans = 0;
    ll start = 1, end = min(MAX_NUM, N*N);
 
    while (start <= end) {
        ll mid = (start+end)/2;
        ll count = f(mid);
        if (count < K) {
            start = mid+1;
        } else {
            ans = mid;
            end = mid-1;
        }
    }
    cout << ans << '\n';
}

Reference