-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1074.cpp
68 lines (62 loc) · 1008 Bytes
/
1074.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// 1074. Z
// 2019.05.14
// 수학, 분할 정복, 재귀 호출
#include<iostream>
#include<cmath>
using namespace std;
// Z를 도는 재귀함수
long long go(long long n, int r, int c)
{
long long tmp = 0;
if (n == 2)
{
if (r == 1 && c == 1)
{
return 1;
}
else if (r == 1 && c == 2)
{
return 2;
}
else if (r == 2 && c == 1)
{
return 3;
}
else if (r == 2 && c == 2)
{
return 4;
}
}
long long mid = n / 2;
// 좌상
if (r <= mid && c <= mid)
{
tmp = tmp + go(mid, r, c);
}
// 우상
else if (r <= mid && c > mid)
{
tmp = tmp + go(mid, r, c - mid) + ((n * n) / 4);
}
// 좌하
else if (r > mid && c <= mid)
{
tmp = tmp + go(mid, r - mid, c) + ((n * n * 2) / 4);
}
// 우하
else if (r > mid && c > mid)
{
tmp = tmp + go(mid, r - mid, c - mid) + ((n * n * 3) / 4);
}
return tmp;
}
int main()
{
int N, r, c;
cin >> N >> r >> c;
long long n = pow(2, N);
long long ans = go(n, r + 1, c + 1);
--ans;
cout << ans << endl;
return 0;
}