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> {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().split_whitespace()
        .map(|e| e.parse().ok().unwrap()).collect()
}

fn read_vec2<T: std::str::FromStr>(n: usize) -> Vec<Vec<T>> {
    let mut v2 = Vec::new();
    for _ in 0..n {
        let mut s = String::new();
        std::io::stdin().read_line(&mut s).ok();
        let v = s.trim().split_whitespace()
            .map(|e| e.parse().ok().unwrap()).collect();
        v2.push(v);
    }
    v2
}

fn main() {
    let n: usize = read();
    let a: Vec<usize> = read_vec();
    let mut counter = 0;

    for i in 1..9 {
        let rate_low = if i == 1 { 1 } else { 400 * (i - 1) };
        let rate_high = i * 400 - 1;

        for v in a.iter() {
            if rate_low <= *v && *v <= rate_high {
                counter += 1;
                break;
            }
        }
    }
    
    let mut c = 0;
    for v in a.iter() {
        if *v >= 3200 {
            c += 1;
        }
    }

    println!("{} {}", counter, counter+c)
}