๋ฌธ์
https://www.acmicpc.net/problem/1074
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x0B - ์ฌ๊ท
์๊ณ ๋ฆฌ์ฆ: ์ฌ๊ท
ํ์ด
ํฌ๊ธฐ๊ฐ 2N × 2N์ธ 2์ฐจ์ ๋ฐฐ์ด์ Z๋ชจ์์ผ๋ก ํ์ํ๋ ค๊ณ ํ๋ค.
N > 1์ธ ๊ฒฝ์ฐ, ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ 2N-1 × 2N-1๋ก 4๋ฑ๋ถ ํ ํ์ ์ฌ๊ท์ ์ผ๋ก ์์๋๋ก ๋ฐฉ๋ฌธํ๋ค.
N์ด ์ฃผ์ด์ก์ ๋, rํ c์ด์ ๋ช ๋ฒ์งธ๋ก ๋ฐฉ๋ฌธํ๋์ง ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
2์ N์ ๊ณฑ๋งํผ์ ํ๋ ฌ์ด ์กด์ฌํ ๋, N์ด 1์ผ๋๋ถํฐ N์ด ๋ ๋๊น์ง Z๋ชจ์์ผ๋ก ํ์ํ๋ค.
๋ค์๋งํด N = 1์ผ๋๊ฐ ๊ธฐ๋ณธ๊ฐ์ด๋ผ๋ ์๋ฆฌ๋ค.
2์ 1์ ๊ณฑ์ 2๋๊น 2x2ํ๋ ฌ์
0 1
2 3
ํ์์ผ๋ก ๋ฐฉ๋ฌธํด์ผํ๊ณ , ์ด ํ์์ N๊น์ง ํ์ฅํด๋๊ฐ๋ฉด ๋๋ค.
๋ค๋ง ์ ์ฒด ํ๋ ฌ๊ฐ์ ์ถ๋ ฅํ๋๊ฒ ์๋ rํ c์ด์ ๊ฐ๋ง ์ฐพ์ผ๋ฉด ๋๊ธฐ ๋๋ฌธ์, ํ๋ ฌ[r][c]๊ฐ ํฌํจ๋๋ 2x2ํ๋ ฌ ์ธ์ ๊ณ์ฐํ์ง ์์๋ ๋๋ค.
์ฆ ํ๋ ฌ์ ์ฌ๋ถ๋ฉด์ผ๋ก ๋๋ ๋ค rc๊ฐ ์ด๋ ์ฌ๋ถ๋ฉด์ ํด๋นํ๋์ง๋ฅผ ์ฐพ๊ณ ๊ทธ ์ฌ๋ถ๋ฉด๋ง ๊ณ์ฐํ๋ฉด ๋๋๊ฒ์ด๋ค.
2^N x 2^N ํ๋ ฌ์ ์ฌ๋ฑ๋ถ์ผ๋ก ๋๋๋ฉด ๊ฐ ์ฌ๋ฑ๋ถ์ 2^(N-1) x 2^(N-1)์ด ๋๋ค.2^(N-1)์ด r, c๋ณด๋ค ํฌ๋ค๋ฉด 1์ฌ๋ถ๋ฉด, r๋ณด๋ค ํฌ๊ณ c๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค๋ฉด 2์ฌ๋ถ๋ฉด,
r๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๊ณ c๋ณด๋ค ํฌ๋ค๋ฉด 3์ฌ๋ถ๋ฉด, r, c๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค๋ฉด 4์ฌ๋ถ๋ฉด์ด ๋๊ฒ ๋ค.
2, 3, 4๋ถ๋ฉด์ ํด๋น๋ ๊ฒฝ์ฐ 2^(N-1) x 2^(N-1)๋งํผ์ฉ์ ๊ฐ์ด ์์ ์ ์กด์ฌํ๋ค๋ ์๋ฆฌ์ด๋ฏ๋ก ๋ฐ๋ก ๋ํด์ค์ผํ๋ค.
์์ ์ ๊ฐ์ด N, r, c๊ฐ 2 3 1๋ก ์ฃผ์ด์ก์๋๋ฅผ ๊ฐ์ ํด๋ณด์.
ํจ์๋ make_z(n, r, c)๋ก ํฌ๊ธฐ, ํ, ์ด ๊ฐ์ ์ธ์๋ก ์ง์ ํด๋์ํ๋ค.
4x4 ํ๋ ฌ์ 3ํ 1์ด ๊ฐ์ ์ฐพ์์ผํ๋ค.2^(N-1)์ 2๊ฐ ๋๋ค. ์ฌ๋ถ๋ฉด์ ๋๋๋ ๊ธฐ์ค์ 2ํ 2์ด์ด ๋๋ค.
r(3)๋ณด๋ค ์๊ณ c(1)๋ณด๋ค๋ ํฌ๋ฏ๋ก 3์ฌ๋ถ๋ฉด์ ํด๋น๋๋ค.
๊ทธ๋ผ 3์ฌ๋ถ๋ฉด์ ๊ธฐ์ค์ผ๋ก ๋ ์ฌ๋ถ๋ฉด์ ๋๋ ํ ์์ ๊ณผ์ ์ ๋ฐ๋ณตํด์ผํ๋ค.
๊ทธ๋ฆฌ๊ณ Z๋ชจ์์ผ๋ก ํ์ํด์ผํ๋ฏ๋ก 1, 2์ฌ๋ถ๋ฉด์ ํฌ๊ธฐ๋งํผ ๋ํด์ค์ผํ๋ค.2 * 2^(N-1) * 2^(N-1) + make_z(N-1, r-(2^(N-1)), c)๋ฅผ ๋ฐํํ๋ค.
๊ทธ๋ผ 8 + make_z(1, r-2, c)๊ฐ ์คํ๋๋์
์ด๋ค.
์ด์ n, r, c๋ 1, 1, 1์ด ๋๋ค.2^(1-1)์ 0, r๊ณผ c ๋ชจ๋ 0๋ณด๋ค ํฌ๋ฏ๋ก 4์ฌ๋ถ๋ฉด์ ํด๋น๋๋ค.3 * 2^(N-1) * 2^(N-1) + make_z(N-1, r-(2^(N-1)), c-(2^(N-1)))๋ฅผ ๋ฐํํ๋ค.
๊ทธ๋ผ 3 + make_z(0, 1, 1)์ด ์คํ๋๋๋ฐ, N์ด 0์ด๋ฏ๋ก 0์ ๋ฐํํ๋ค.
๋ฐ๋ผ์ ์ต์ข
๊ฒฐ๊ณผ๊ฐ์ 8 + 3 + 0 = 11์ด ๋๋ค.
์ ์ฒด ์ฝ๋
# โญ ์ ๋ต ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 31120KB / ์๊ฐ: 36ms
from sys import stdin
N, r, c = map(int, stdin.readline().split())
def make_z(n, r, c):
if n == 0:
return 0
half = 2 ** (n-1)
if r < half and c < half: # 1์ฌ๋ถ๋ฉด
return make_z(n-1, r, c)
elif r < half and c >= half: # 2์ฌ๋ถ๋ฉด
return half * half + make_z(n-1, r, c-half)
elif r >= half and c < half: # 3์ฌ๋ถ๋ฉด
return 2 * half * half + make_z(n-1, r-half, c)
else: # 4์ฌ๋ถ๋ฉด
return 3 * half * half + make_z(n-1, r-half, c-half)
print(make_z(N, r, c))
์ฌ๊ท, DP๋ ํ์ด๋ ํ์ด๋ ์ด๋ ต๋ค...
๊ทธ๋๋ ํ๋ฆฐ์ฝ๋๋ผ๋ ๋๋ ค๋ณด๊ณ ์ ๋ต์ ์ฐพ๋๊ฒ ํจ์ฌ ๋์๊ฒ๊ฐ๋ค. (์ฌ๋งํด์ ...^^)