출처: https://cses.fi/problemset/task/1071
문제 설명
A number spiral is an infinite grid whose upper-left square has number 1. Here are the first five layers of the spiral:
1 | 2 | 9 | 10 | 25 |
4 | 3 | 8 | 11 | 24 |
5 | 6 | 7 | 12 | 23 |
16 | 15 | 14 | 13 | 22 |
17 | 18 | 19 | 20 | 21 |
Your task is to find out the number in row y and column x.
입력
The first input line contains an integer t: the number of tests.
After this, there are tt lines, each containing integers y and x.
출력
For each test, print the number in row y and column x.
입력 예
3
2 3
1 1
4 2
출력 예
8
1
15
제약조건
- 1 <= t <= 10^5
- 1 <= y , x <= 10^9
문제 풀이
(y, x) 위치를 입력 받아서, y 와 x 를 비교해서 더 큰 수를 기준으로 출발한다. x의 경우 홀수이면 (2k+1)^2에서 y만큼 줄이면 원하는 답이 되고, 짝수이면 (2k+1)^2+1 에서 y만큼 더하면 된다. y의 경우 짝수이면 (2k)^2에서 x 만큼 줄이고, 홀수이면 (2k)^+1에서 x만큼 더하면 된다.
프로그램 내용
더보기
#define MAX_SQUARE 100000
#define MAX_ELEMENT 1000000000
int main()
{
long long x, y;
cin >> y >> x;
/// (1,1), (1,2), (1,3), ... , (1,t)
/// (2,1), (2,2), (2,3), ... , (2,t)
/// ... (1, (2k-1)) -> (2k-1)^2 , (2,(2k-1)) = (2k-1)^2 - (2-1) = 8
/// ... (2k, 1) -> (2k)^2, (2k, 2) = (2k)^2 - (2-1) = 15
if (x >= y) /// (2,3), (3,3)
if( x%2 == 1) /// x = 2k-1,
result[i] = x*x - (y-1);
else
result[i] = (x-1)*(x-1) + y;
else /// y > x
if( y%2 == 0 ) /// y = 2k,
result[i] = y*y - (x-1);
else
result[i] = (y-1)*(y-1) + x;
for (int i=0; i< TestNum; i++)
cout << result[i] << endl;
Introductory problems ( link )
'CSES' 카테고리의 다른 글
CSES 1. Two Knights (1072) (0) | 2019.09.22 |
---|---|
CSES 1. Two Sets (1092) (0) | 2019.09.21 |
CSES 1. Permutations (1070) (0) | 2019.09.19 |
CSES 1. Increasing Array (1094) (0) | 2019.09.19 |
CSES 1. Repetitions (1069) (0) | 2019.09.16 |