이번 문제는 분할정복을 통해 해결하였다. 규칙을 찾는데에 시간을 많이 썼지만 실패하였고 다른 사람들의 풀이를 조금 참고하였다.
우선 이 문제에서 중요한 것은 사분면으로 계속해서 나누는 것이다. 사분면으로 나눈 후에 구하고자 하는 좌표가 속하는 사분면으로 재귀 호출을 하고, 그 사분면 안에서 다시 좌표가 속하는 사분면으로 재귀 호출을 하게 된다. 이 과정을 사분면으로 나눌 수 없을 때까지 반복하게 되면 정답을 구할 수 있게 된다.
1사분면에 해당할 경우에는 바로 재귀호출을 하면 되지만, 2사분면은 x좌표를 2**size
만큼 빼준 후에 재귀호출을 해야 한다. 3사분면은 y좌표를 2**size
만큼 빼준 후에 재귀호출을 해야 하고, 4사분면은 x, y좌표를 모두 2**size
만큼 빼준 후에 재귀호출을 해야 한다. 이 과정을 적용해주어야 재귀 과정에서 다음 사분면을 쫓아갈 수 있게 된다.
2**size
보다 작고, x가 2**size
보다 작을 경우, (제 1 사분면)(2**size)*(2**size)*0
을 더한다.recursion(size, y, x)
를 재귀호출한다.2**size
보다 작고, x가 2**size
보다 크거나 같을 경우, (제 2 사분면)(2**size)*(2**size)*1
을 더한다.(2**size)
만큼 감소시킨다.recursion(size, y, x)
를 재귀호출한다.2**size
보다 크거나 같고, x가 2**size
보다 작을 경우, (제 3 사분면)2**size
만큼 감소시킨다.recursion(size, y, x)
를 재귀호출한다.2**size
보다 크거나 같고, x가 2**size
보다 크거나 같을 경우, (제 4 사분면)2**size
만큼 감소시킨다.2**size
만큼 감소시킨다.recursion(size, y, x)
를 재귀호출한다.recursion(N, r, c)
를 호출한다.N, r, c=map(int, input().split())
answer=0
def recursion(size, y, x):
global answer
if size==0:
return
size-=1
if y<2**size and x<2**size:
answer+=(2**size)*(2**size)*0
recursion(size, y, x)
elif y<2**size and x>=2**size:
answer+=(2**size)*(2**size)*1
x-=(2**size)
recursion(size, y, x)
elif y>=2**size and x<2**size:
answer+=(2**size)*(2**size)*2
y-=(2**size)
recursion(size, y, x)
else:
answer+=(2**size)*(2**size)*3
y-=(2**size)
x-=(2**size)
recursion(size, y, x)
recursion(N, r, c)
print(answer)