Problem:
Score : 400 points

Problem Statement

Let {\rm comb}(n,r) be the number of ways to choose r objects from among n objects, disregarding order.
From n non-negative integers a_1, a_2, ..., a_n, select two numbers a_i > a_j so that {\rm comb}(a_i,a_j) is maximized.
If there are multiple pairs that maximize the value, any of them is accepted.

Constraints

2 \leq n \leq 10^5

0 \leq a_i \leq 10^9

a_1,a_2,...,a_n are pairwise distinct.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

n
a_1 a_2 ... a_n

Output

Print a_i and a_j that you selected, with a space in between.

Sample Input 1

5
6 9 4 2 11

Sample Output 1

11 6

\rm{comb}(a_i,a_j) for each possible selection is as follows:

\rm{comb}(4,2)=6

\rm{comb}(6,2)=15

\rm{comb}(6,4)=15

\rm{comb}(9,2)=36

\rm{comb}(9,4)=126

\rm{comb}(9,6)=84

\rm{comb}(11,2)=55

\rm{comb}(11,4)=330

\rm{comb}(11,6)=462

\rm{comb}(11,9)=55

Thus, we should print 11 and 6.

Sample Input 2

2
100 0

Sample Output 2

100 0

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <sstream>
#include <random>
#include <utility>
#include <map>
#include <vector>
#include <queue>
#include <bitset>
#include <sstream>
#define REP(i,x) for(int i=0; i<(x); i++)
typedef long long ll;

using namespace std;

int main(int argc, const char * argv[]) {
    int n;
    cin>>n;
    int a[n];
    REP(i, n){
        cin>>a[i];
    }
    sort(a, a+n);
    int max[] = {1,1};
    for(int i=n-1;i>n/2; i--){
        cout << a[i]<< ":";
        int lb1 = *lower_bound(a, a+n, (a[i]/2) );
        int lb2 = *next(lower_bound(a, a+n, (a[i]/2) ));
        cout << lb1 << " " << lb2 << endl;
        int lb;
        if (abs((a[i]/2)-lb1)<abs((a[i]/2)-lb2)) {
            lb = lb1;
        }else{
            lb=lb2;
        }
        if(i==n-1){
            max[0] = a[i];
            max[1]=lb;
        }else{
            int x = max[0]-a[i];
            int y = lb-max[1];
            double diff;
            if (y>=0) {
                double ue = 1;
                for (int j=0; j<= x+y; j++) {
                    ue *= max[0]-max[1]-j;
                }
                double sita = 1;
                for (int j=0; j<x; j++) {
                    sita *= max[0]-j;
                }
                for (int j=y; j>0; j--) {
                    sita *= max[1]+j;
                }
                diff = ue/sita;
            }else{
                y = -1*y;
                double part1 = 1;
                double part2 = 1;
                double part3 = 1;
                for (int j=0; j<y; j++) {
                    part1 *= max[1]-j;
                }
                for (int j=0; j<x; j++) {
                    part2 *= max[0]-j;
                }
                if (x==y) {
                    diff = part1/part2;
                }else if(x>y){
                    for (int j=0; j<=x-y; j++) {
                        part3*=max[0]-max[1]+j;
                    }
                    diff = part1*part3/part2;
                }else{
                    for (int j=y-x; j>0; j--) {
                        part3*=max[0]-max[1]+j;
                    }
                    diff = part1/(part2*part3);
                }
            }
            
            if (diff > 1) {
                max[0] = a[i];
                max[1] = lb;
            }
        }
    }
    cout << max[0] << " " <<max[1] << endl;
    
    return 0;
}