Problem:
床

　

ヒデヨ博士の家の床には正方形のタイルが敷きつめられています。芸術に造詣が深いヒデヨ博士は、赤、黄、青の塗料を使ってタイルに色を塗ることにしました。はじめに部屋の適当なタイルをひとつ選び、以下の方法で色を塗っていきます。

タイルを塗る色を、赤（図の番号１）、黄（図の番号２）、青（図の番号３）の順に変えていき、青の次はまた赤から始める。

すでに色を塗った領域の隣に正方形を追加し、そこに色を塗る。それらを合わせた領域が長方形になるようにする。正方形を追加する方向は、東、北、西、南の順に変えていき、南の次はまた東から始める（図では、上方向が北、右方向が東である）。

最初に赤く塗ったタイルから東西方向に$x$個、南北方向に$y$個移動したところにあるタイルは、何色に塗られているでしょうか。ただし、東の方向を$x$の正の方向、北の方向を$y$の正の方向とします。

$x$と$y$を入力し、タイルの色を出力するプログラムを作成せよ。

入力

入力は以下の形式で与えられる。

$x$ $y$

１行に$x$と$y$ ($-10^6 \leq x,y \leq 10^6$)が与えられる。

出力

タイルの色が赤のとき1、黄のとき2、青のとき3を１行に出力する。

入出力例

入力例１

0 0

出力例１

1

入力例２

-4 5

出力例２

2

入力例３

8 -14

出力例３

3

Solution in C++ (judge verdict: Accepted)

#include<iostream>
#include<algorithm>
using namespace std;
inline int fib(int n){
    if(n==0||n==1){
        return 1;
    }
    return fib(n-1)+fib(n-2);
}
int main(){
    int x,y;
    cin >> x >> y;

    int xmin=0;
    int xmax=1;
    int ymin=0;
    int ymax=1;
    int c=0;

    while(1){
        if(xmin<=x&&x<xmax&&ymin<=y&&y<ymax){
            cout << c%3+1 <<endl;
            return 0;
        }
        
        c++;
        xmin=xmax;
        xmax=xmin+fib(c);
        ymin=ymin;
        ymax=ymin+fib(c);
        if(xmin<=x&&x<xmax&&ymin<=y&&y<ymax){
            cout << c%3+1 <<endl;
            return 0;
        }

        c++;
        xmax=xmax;
        xmin=xmax-fib(c);
        ymin=ymax;
        ymax=ymin+fib(c);
        if(xmin<=x&&x<xmax&&ymin<=y&&y<ymax){
            cout << c%3+1 <<endl;
            return 0;
        }

        c++;
        xmax=xmin;
        xmin=xmax-fib(c);
        ymax=ymax;
        ymin=ymax-fib(c);
        if(xmin<=x&&x<xmax&&ymin<=y&&y<ymax){
            cout << c%3+1 <<endl;
            return 0;
        }

        c++;
        xmin=xmin;
        xmax=xmin+fib(c);
        ymax=ymin;
        ymin=ymax-fib(c);
    }
    return 0;
}