Problem: Example

Input

3 5 4
3
6
12


Output

Hanako

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define HUGE_NUM 99999999999999999
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


#define NUM 100005

enum Which{
	Hanako,
	Jiro,
};

int N,A,B;
int table[NUM];

int calc_xor(int mod){

	int ret = 0;

	for(int i = 0; i < N; i++){
		ret ^= (table[i]%mod);
	}

	return ret;
}

int main(){

	scanf("%d %d %d",&N,&A,&B);

	for(int i = 0; i < N; i++){
		scanf("%d",&table[i]);
	}

	Which winner;
	bool FLG;

	if(A == B){

		//普通のNim
		if(calc_xor(A+1) != 0){
			/*
			 * 初期状態でニム和が非0であれば、先手はニム和0(mod(A+1)下)の状態にもっていくことができ、
			 * 「勝ち状態」を作れるから勝つ
			 * */
			winner = Hanako;

		}else{
			winner = Jiro;
		}
	}else if(A > B){

		FLG = false;

		//少なくとも1つB+1以上の山があれば、mod(B+1)で0の状態を後手に送り付けられるのでHanako必勝
		for(int i = 0; i < N; i++){
			if(table[i] >= B+1){
				FLG = true;
				break;
			}
		}

		if(FLG){

			winner = Hanako;

		}else{

			if(calc_xor(B+1) != 0){ //★判定α★
				winner = Hanako;
			}else{
				/*
				 * ★B+1個以上の山がない→お互いの上限がBであり、かつ判定αが偽、つまり初期状態でmod(B+1)でニム和が0なので、
				 * 後手は必ずmod(B+1)でニム和0の状態を先手に送り付けられる。終了状態は、石が0個、つまりmod(B+1)の下でニム和が0である。
				 * よって、先手は必ずニム和0の状態で石を取らねばならず、その結果はmod(B+1)下でのニム和を0にできない
				 * (★B+1個取れれば良いが、B個までしか取れないから★)。よって、後手必勝。★
				 * */
				winner = Jiro;
			}
		}

	}else{ //A < B

		int tmp_count = 0; //(A+1)個以上の石が積んである山の個数を数える
		int tmp_index,other_xor;

		for(int i = 0; i < N; i++){
			if(table[i] >= A+1){
				tmp_count++;
				tmp_index = i;
			}
		}

		if(tmp_count >= 2){
			//後手は先手に、(A < B)の状態でmod(A+1)でのニム和0の状態を回せるので、後手必勝
			winner = Jiro;

		}else{

			if(tmp_count == 0){ //A+1個以上の山がなければ、お互いの上限がAであるのと結果は同じ

				if(calc_xor(A+1) != 0){

					winner = Hanako;

				}else{

					winner = Jiro;
				}
			}else{ //tmp_count == 1

				FLG = false;

				//他の山のxorを計算
				other_xor = 0;

				for(int i = 0; i < N; i++){
					if(i == tmp_index)continue;
					other_xor ^= (table[i]%(A+1));
				}

				//mod(A+1)下でのニム和0を作れれば先手必勝
				for(int i = 1; i <= A; i++){

					if(table[tmp_index]-i >= A+1)continue; //A+1個残っていたら不可(★次に、後手にmod(A+1)下でのニム和0を作られるから★)

					if((other_xor^(table[tmp_index]-i)%(A+1)) == 0){

						FLG = true;
						break;
					}
				}

				if(FLG){

					winner = Hanako;

				}else{

					winner = Jiro;
				}
			}
		}
	}

	if(winner == Hanako){

		printf("Hanako\n");

	}else{

		printf("Jiro\n");
	}

	return 0;
}