Little Vasya has received a young builder’s kit. The kit consists of several wooden bars, the lengths of all of them are known. The bars can be put one on the top of the other if their lengths are the same.

Vasya wants to construct the minimal number of towers from the bars. Help Vasya to use the bars in the best way possible.

Input

The first line contains an integer N (1 ≤ N ≤ 1000) — the number of bars at Vasya’s disposal. The second line contains N space-separated integers li — the lengths of the bars. All the lengths are natural numbers not exceeding 1000.

Output

In one line output two numbers — the height of the largest tower and their total number. Remember that Vasya should use all the bars.

Examples

Input

3
1 2 3


Output

1 3


Input

4
6 5 6 7


Output

2 3

import java.io.*;
import java.util.*;
import java.*;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Random;
import java.lang.*;
 



 
 
public class zad {
private static BufferedReader in;
private static StringTokenizer tok;
private static PrintWriter out;
final static boolean ONLINE_JUDGE = System.getProperty("ONLINE_JUDGE") !=null;
 
public static void init() throws FileNotFoundException{
if(ONLINE_JUDGE){
in = new BufferedReader(new InputStreamReader(System.in));
out = new PrintWriter(System.out);
}
else{
in = new BufferedReader(new FileReader("input.txt"));
out = new PrintWriter("out.txt");
}
}
 
private static String readString() throws IOException {
while (tok == null || !tok.hasMoreTokens()) {
tok = new StringTokenizer(in.readLine());
}
return tok.nextToken();
}
 
private static int readInt() throws IOException {
return Integer.parseInt(readString());
}
private static double readDouble() throws IOException {
return Double.parseDouble(readString());
}
private static long readLong() throws IOException {
return Long.parseLong(readString());
}
private static float readFloat() throws IOException{
    return Float.parseFloat(readString());
}
 
 
public static class Point{
    
    int x;
    int num;
    
    Point(int x, int mum){
        this.x = x;
        num = mum;
    }
    public void Incr(){
        num++;
    }
    
    public int getX(){
        return x;
    }
    public int getNum(){
        return num;
    }
    
}



public static void Solve() throws IOException{

    int n =readInt();
    int max =0;
    ArrayList<Point> mas = new ArrayList<Point>();
    for(int i=0;i<n;i++){
        int k =readInt();
        
        boolean b =true;
        for(int j=0;j<mas.size();j++){
            if(mas.get(j).getX()==k){
                mas.get(j).Incr();
                b=false;
                break;
            }
        }
        if(b){
            mas.add(new Point(k,1));
        }
        
    }
    for(int i=0;i<mas.size();i++){
        max = max>mas.get(i).getNum() ? max:mas.get(i).getNum();
    }
    out.print(max+" "+mas.size());
}
    
    




public static void main(String[] args) throws IOException {
init();
Solve();
 
 
in.close();
out.close();
}
}