

import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		new Main().start();
	}
	void start(){
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		boolean[] minColors = new boolean[8];
		boolean[] maxColors = new boolean[8];
		int countMaxRate = 0;
		for(int i = 0; i < n; i++){
			int score = in.nextInt();
			int rate = score / 400;
			if(rate < 8){
				minColors[rate] = true;
				maxColors[rate] = true;
			}else{
				countMaxRate++;
			}
		}
		for(int i = 0; i < countMaxRate; i++){
			boolean hasFound = false;
			for(int j = 0; j < 8; j++){
				if(minColors[j]){
					hasFound = true;
					break;
				}
			}
			if(!hasFound){
				minColors[0] = true;
				break;
			}
		}
		int min = getCount(minColors);
		int max = getCount(maxColors) + countMaxRate;
		System.out.println(min + " " + max);
		in.close();
	}
	int getCount(boolean[] a){
		int count = 0;
		for(boolean b : a){
			if(b) count++;
		}
		return count;
	}

} import java.util.Scanner; Scanner java.util public class Main{

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		new Main().start();
	}
	void start(){
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		boolean[] minColors = new boolean[8];
		boolean[] maxColors = new boolean[8];
		int countMaxRate = 0;
		for(int i = 0; i < n; i++){
			int score = in.nextInt();
			int rate = score / 400;
			if(rate < 8){
				minColors[rate] = true;
				maxColors[rate] = true;
			}else{
				countMaxRate++;
			}
		}
		for(int i = 0; i < countMaxRate; i++){
			boolean hasFound = false;
			for(int j = 0; j < 8; j++){
				if(minColors[j]){
					hasFound = true;
					break;
				}
			}
			if(!hasFound){
				minColors[0] = true;
				break;
			}
		}
		int min = getCount(minColors);
		int max = getCount(maxColors) + countMaxRate;
		System.out.println(min + " " + max);
		in.close();
	}
	int getCount(boolean[] a){
		int count = 0;
		for(boolean b : a){
			if(b) count++;
		}
		return count;
	}

} Main public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		new Main().start();
	} main {
		// TODO 自動生成されたメソッド・スタブ
		new Main().start();
	} new Main().start() new Main().start new Main() String[] args args void start(){
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		boolean[] minColors = new boolean[8];
		boolean[] maxColors = new boolean[8];
		int countMaxRate = 0;
		for(int i = 0; i < n; i++){
			int score = in.nextInt();
			int rate = score / 400;
			if(rate < 8){
				minColors[rate] = true;
				maxColors[rate] = true;
			}else{
				countMaxRate++;
			}
		}
		for(int i = 0; i < countMaxRate; i++){
			boolean hasFound = false;
			for(int j = 0; j < 8; j++){
				if(minColors[j]){
					hasFound = true;
					break;
				}
			}
			if(!hasFound){
				minColors[0] = true;
				break;
			}
		}
		int min = getCount(minColors);
		int max = getCount(maxColors) + countMaxRate;
		System.out.println(min + " " + max);
		in.close();
	} start {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		boolean[] minColors = new boolean[8];
		boolean[] maxColors = new boolean[8];
		int countMaxRate = 0;
		for(int i = 0; i < n; i++){
			int score = in.nextInt();
			int rate = score / 400;
			if(rate < 8){
				minColors[rate] = true;
				maxColors[rate] = true;
			}else{
				countMaxRate++;
			}
		}
		for(int i = 0; i < countMaxRate; i++){
			boolean hasFound = false;
			for(int j = 0; j < 8; j++){
				if(minColors[j]){
					hasFound = true;
					break;
				}
			}
			if(!hasFound){
				minColors[0] = true;
				break;
			}
		}
		int min = getCount(minColors);
		int max = getCount(maxColors) + countMaxRate;
		System.out.println(min + " " + max);
		in.close();
	} Scanner in = new Scanner(System.in); in new Scanner(System.in) int n = in.nextInt(); n in.nextInt() in.nextInt in boolean[] minColors = new boolean[8]; minColors new boolean[8] 8 boolean[] maxColors = new boolean[8]; maxColors new boolean[8] 8 int countMaxRate = 0; countMaxRate 0 for(int i = 0; i < n; i++){
			int score = in.nextInt();
			int rate = score / 400;
			if(rate < 8){
				minColors[rate] = true;
				maxColors[rate] = true;
			}else{
				countMaxRate++;
			}
		} int i = 0; int i = 0; i 0 i < n i n i++ i++ i {
			int score = in.nextInt();
			int rate = score / 400;
			if(rate < 8){
				minColors[rate] = true;
				maxColors[rate] = true;
			}else{
				countMaxRate++;
			}
		} {
			int score = in.nextInt();
			int rate = score / 400;
			if(rate < 8){
				minColors[rate] = true;
				maxColors[rate] = true;
			}else{
				countMaxRate++;
			}
		} int score = in.nextInt(); score in.nextInt() in.nextInt in int rate = score / 400; rate score / 400 score 400 if(rate < 8){
				minColors[rate] = true;
				maxColors[rate] = true;
			}else{
				countMaxRate++;
			} rate < 8 rate 8 {
				minColors[rate] = true;
				maxColors[rate] = true;
			} minColors[rate] = true minColors[rate] minColors rate true maxColors[rate] = true maxColors[rate] maxColors rate true {
				countMaxRate++;
			} countMaxRate++ countMaxRate for(int i = 0; i < countMaxRate; i++){
			boolean hasFound = false;
			for(int j = 0; j < 8; j++){
				if(minColors[j]){
					hasFound = true;
					break;
				}
			}
			if(!hasFound){
				minColors[0] = true;
				break;
			}
		} int i = 0; int i = 0; i 0 i < countMaxRate i countMaxRate i++ i++ i {
			boolean hasFound = false;
			for(int j = 0; j < 8; j++){
				if(minColors[j]){
					hasFound = true;
					break;
				}
			}
			if(!hasFound){
				minColors[0] = true;
				break;
			}
		} {
			boolean hasFound = false;
			for(int j = 0; j < 8; j++){
				if(minColors[j]){
					hasFound = true;
					break;
				}
			}
			if(!hasFound){
				minColors[0] = true;
				break;
			}
		} boolean hasFound = false; hasFound false for(int j = 0; j < 8; j++){
				if(minColors[j]){
					hasFound = true;
					break;
				}
			} int j = 0; int j = 0; j 0 j < 8 j 8 j++ j++ j {
				if(minColors[j]){
					hasFound = true;
					break;
				}
			} {
				if(minColors[j]){
					hasFound = true;
					break;
				}
			} if(minColors[j]){
					hasFound = true;
					break;
				} minColors[j] minColors j {
					hasFound = true;
					break;
				} hasFound = true hasFound true break; if(!hasFound){
				minColors[0] = true;
				break;
			} !hasFound hasFound {
				minColors[0] = true;
				break;
			} minColors[0] = true minColors[0] minColors 0 true break; int min = getCount(minColors); min getCount(minColors) getCount minColors int max = getCount(maxColors) + countMaxRate; max getCount(maxColors) + countMaxRate getCount(maxColors) getCount maxColors countMaxRate System.out.println(min + " " + max) System.out.println System.out System System.out min + " " + max min + " " + max min " " max in.close() in.close in int getCount(boolean[] a){
		int count = 0;
		for(boolean b : a){
			if(b) count++;
		}
		return count;
	} getCount {
		int count = 0;
		for(boolean b : a){
			if(b) count++;
		}
		return count;
	} int count = 0; count 0 for(boolean b : a){
			if(b) count++;
		} boolean b a {
			if(b) count++;
		} {
			if(b) count++;
		} if(b) count++; b count++ count return count; count boolean[] a a public class Main{

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		new Main().start();
	}
	void start(){
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		boolean[] minColors = new boolean[8];
		boolean[] maxColors = new boolean[8];
		int countMaxRate = 0;
		for(int i = 0; i < n; i++){
			int score = in.nextInt();
			int rate = score / 400;
			if(rate < 8){
				minColors[rate] = true;
				maxColors[rate] = true;
			}else{
				countMaxRate++;
			}
		}
		for(int i = 0; i < countMaxRate; i++){
			boolean hasFound = false;
			for(int j = 0; j < 8; j++){
				if(minColors[j]){
					hasFound = true;
					break;
				}
			}
			if(!hasFound){
				minColors[0] = true;
				break;
			}
		}
		int min = getCount(minColors);
		int max = getCount(maxColors) + countMaxRate;
		System.out.println(min + " " + max);
		in.close();
	}
	int getCount(boolean[] a){
		int count = 0;
		for(boolean b : a){
			if(b) count++;
		}
		return count;
	}

} public class Main{

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		new Main().start();
	}
	void start(){
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		boolean[] minColors = new boolean[8];
		boolean[] maxColors = new boolean[8];
		int countMaxRate = 0;
		for(int i = 0; i < n; i++){
			int score = in.nextInt();
			int rate = score / 400;
			if(rate < 8){
				minColors[rate] = true;
				maxColors[rate] = true;
			}else{
				countMaxRate++;
			}
		}
		for(int i = 0; i < countMaxRate; i++){
			boolean hasFound = false;
			for(int j = 0; j < 8; j++){
				if(minColors[j]){
					hasFound = true;
					break;
				}
			}
			if(!hasFound){
				minColors[0] = true;
				break;
			}
		}
		int min = getCount(minColors);
		int max = getCount(maxColors) + countMaxRate;
		System.out.println(min + " " + max);
		in.close();
	}
	int getCount(boolean[] a){
		int count = 0;
		for(boolean b : a){
			if(b) count++;
		}
		return count;
	}

} Main


import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		new Main().start();
	}
	void start(){
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		boolean[] minColors = new boolean[8];
		boolean[] maxColors = new boolean[8];
		int countMaxRate = 0;
		for(int i = 0; i < n; i++){
			int score = in.nextInt();
			int rate = score / 400;
			if(rate < 8){
				minColors[rate] = true;
				maxColors[rate] = true;
			}else{
				countMaxRate++;
			}
		}
		for(int i = 0; i < countMaxRate; i++){
			boolean hasFound = false;
			for(int j = 0; j < 8; j++){
				if(minColors[j]){
					hasFound = true;
					break;
				}
			}
			if(!hasFound){
				minColors[0] = true;
				break;
			}
		}
		int min = getCount(minColors);
		int max = getCount(maxColors) + countMaxRate;
		System.out.println(min + " " + max);
		in.close();
	}
	int getCount(boolean[] a){
		int count = 0;
		for(boolean b : a){
			if(b) count++;
		}
		return count;
	}

}
