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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
#define all(x) (x).begin(),(x).end()
#define pll pair<ll,ll>
#define pii pair<int,int>
#define rep(i,n) for(int i=0;i<n;i++)
#define For(i,a,b) for(int i=a;i<b;i++)
#define sz(x) ((ll)(x).size())
#define pb push_back
#define mp make_pair
#define bit(n) (1LL<<(n))
#define F first
#define S second
#define debug(x) cerr << x << endl
#define Complex complex<double>
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
const ll INF = 1LL<<60;
const ll mod = (int)1e9 + 7;

int n;
set<int> v;
set<int> l;
set<int> r;
void fractale(int x){
    int num=-1;
    int tem=x;
    while(tem){
        tem/=2;
        num++;
    }
    int bis=pow(2,num);
    int y=x-bis;
    if(!y){
        rep(i,bis){
            v.insert(i);
            v.insert(n-i-1);
        }
        return;
    }
    set<int> tel;
    set<int> ter;
  	v.insert(0);
  	l.insert(0);
  	v.insert(x-1);
  	r.insert(x-1);
    for(int p:l){
        v.insert(p+y-1);
        ter.insert(p+y-1);
    }
    for(int p:r){
        v.insert(p-y+1);
        tel.insert(p-y+1);
    }
    for(int p:tel)l.insert(p);
    for(int p:ter)r.insert(p);
    fractale(y);
}

int main() {
    //int n;
    cin >> n;
    int a[n];
    bool one=false;
    rep(i,n){
      	char c;
      	cin >> c;
      	a[i]=c-'1';
        if(a[i]==1)one=true;
    }
    if(one)rep(i,n)a[i]=a[i]%2;
    if(!one){
        rep(i,n)a[i]/=2;
    }
    /*if(n%2){
        int ans=a[0]^a[n-1];
        if(!one)ans*=2;
        cout << ans;
        return 0;
    }*/
    int num=-1;
    int tem=n;
    while(tem){
        tem/=2;
        num++;
    }
    int bis=pow(2,num);
    bis=n-bis;
  	if(!bis)bis=n/2;
    int ans=0;
    fractale(n);
    /*int ans=0;
    rep(i,bis){
        ans=ans^a[i];
        ans=ans^a[n-i-1];
    }
    if(!one)ans*=2;
    cout << ans;*/
    for(int p:v){
        ans=ans^a[p];
      	debug(p);
    }
    if(!one)ans*=2;
    cout << ans;
}
//Aに誤読置くな2020