Problem:
Score : 700 points

Problem Statement

Given is a sequence of N digits a_1a_2\ldots a_N, where each element is 1, 2, or 3.
Let x_{i,j} defined as follows:

x_{1,j} := a_j \quad (1 \leq j \leq N)

x_{i,j} := | x_{i-1,j} - x_{i-1,j+1} | \quad (2 \leq i \leq N and 1 \leq j \leq N+1-i)

Find x_{N,1}.

Constraints

2 \leq N \leq 10^6

a_i = 1,2,3 (1 \leq i \leq N)

Input

Input is given from Standard Input in the following format:

N
a_1a_2\ldotsa_N

Output

Print x_{N,1}.

Sample Input 1

4
1231

Sample Output 1

1

x_{1,1},x_{1,2},x_{1,3},x_{1,4} are respectively 1,2,3,1.

x_{2,1},x_{2,2},x_{2,3} are respectively |1-2| = 1,|2-3| = 1,|3-1| = 2.

x_{3,1},x_{3,2} are respectively |1-1| = 0,|1-2| = 1.

Finally, x_{4,1} = |0-1| = 1, so the answer is 1.

Sample Input 2

10
2311312312

Sample Output 2

0

Solution in C# (Mono 4.6.2.0) (judge verdict: Time Limit Exceeded)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AtCoders {
	class Program {
		static void Main(string[] args) {
			var inputArray = retreiveLongArray();
			var inputCount = 1;

			// 不正な入力は処理しない
			if (inputArray.Length != inputCount) {
				Console.WriteLine("invalid input");
				return;
			}
			var N = inputArray[0];
			var inputString = Console.ReadLine();

			var manage = new ManageDic();

			for (int n = 0; n < N - 1; n++) {
				inputString = manage.process(inputString);
			}

			//答えの出力
			Console.WriteLine(inputString);

		}


		/// <summary>
		/// スペースで区切られた文字列配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static string[] retreiveStringArray() {
			var inputArray = Console.ReadLine().Split(' ');
			return inputArray;
		}

		/// <summary>
		/// スペースで区切られた整数配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static long[] retreiveLongArray() {
			var inputArray = Console.ReadLine().Split(' ');
			var longArray = inputArray.Select(s => long.Parse(s));
			return longArray.ToArray();
		}
	}

	/// <summary>
	/// 辞書を管理しながら答えを求めるクラス
	/// </summary>
	public class ManageDic{

		public Dictionary<string, string> _Dic;

		/// <summary>
		/// コンストラクタ　辞書の初期値をセット
		/// </summary>
		public ManageDic() {
			_Dic = new Dictionary<string, string> {
				{"00","0"},{"01","1"},{"02","2"},
				{ "10","1"},{"11","0"},{"12","1"},{"13","2"},
				{ "20","2"},{"21","1"},{"22","0"},{"23","1"},
				{"31","2"},{"32","1"},{"33","0"},
			};

		}


		/// <summary>
		/// 入力した文字列を一段処理する。処理結果を辞書に追加する
		/// </summary>
		/// <param name="inputStr"></param>
		/// <returns></returns>
		public string process(string inputStr) {

			if (_Dic.ContainsKey(inputStr)) {
				return _Dic[inputStr];
			}
			else {
				var length = inputStr.Length;
				//前半の最後の文字は後半の先頭文字を使って作るので(length / 2)+1
				var mae = inputStr.Substring(0, (length / 2)+1);
				var ushiro = inputStr.Substring(length / 2, length - (length / 2));
				//境目から計算される文字も必要

				var maeAns = process(mae);
				var ushiroAns = process(ushiro);

				var answer = maeAns +  ushiroAns;
				_Dic.Add(inputStr, answer);
				return answer;
			}

		}
	}
}