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 Rust (1.15.1) (judge verdict: Accepted)

#![allow(unused_imports)]
#![allow(non_snake_case)]
use std::cmp::*;
use std::collections::*;
use std::io::Write;

#[allow(unused_macros)]
macro_rules! debug {
    ($($e:expr),*) => {
        #[cfg(debug_assertions)]
        $({
            let (e, mut err) = (stringify!($e), std::io::stderr());
            writeln!(err, "{} = {:?}", e, $e).unwrap()
        })*
    };
}

fn main() {
    let n = read::<usize>();
    let mut a = read::<String>()
        .chars()
        .map(|x| x.to_digit(10).unwrap() as i32)
        .collect::<Vec<_>>();

    let mut a = (1..n).map(|x| (a[x] - a[x - 1]).abs()).collect::<Vec<_>>();
    let n = a.len();

    let one_found = a.iter().filter(|&&x| x == 1).count() > 0;
    if one_found {
        a = a.iter().map(|&x| x % 2).collect::<Vec<_>>();
    } else {
        a = a.iter().map(|&x| x / 2).collect::<Vec<_>>();
    }

    let mut mul2 = vec![0i64; n + 1];
    for i in 0..n + 1 {
        let mut j = i;
        while j & 1 == 0 && j > 0 {
            mul2[i] += 1;
            j >>= 1;
        }
    }
    let mut accum_mul2 = vec![0; n + 1];
    for i in 1..n + 1 {
        accum_mul2[i] = mul2[i] + accum_mul2[i - 1];
    }

    let mut ans = 0;
    for i in 0..n {
        if a[i] == 0 {
            continue;
        }
        if accum_mul2[n - 1] - accum_mul2[i] - accum_mul2[n - 1 - i] == 0 {
            ans ^= 1;
        }
    }
    if !one_found {
        ans *= 2;
    }
    println!("{}", ans);
}

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_whitespace()
        .map(|e| e.parse().ok().unwrap())
        .collect()
}