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 <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

const double PI = acos(-1);
const double E = exp(1);

typedef pair<double,pair<int,int>> res;

int main() {
    cin.sync_with_stdio(false);

    int n;
    cin >> n;

    vector<int> v;
    v.reserve(n);

    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        v.emplace_back(x);
    }

    sort(v.begin(), v.end());

    vector<res> maximals;
    maximals.reserve(n);
    for (int i = n - 1; i >= 1; i--) {
        int p = 0;
        int q = i - 1;
        int needle = i / 2;
        int max = v[n] / 2 + 1;
//        cout << i << endl;
        while (p < q - 1) {
//            cout << p << " " << needle << " " << q << endl;
//            cout << v[p] << " " << v[needle] << " " << v[q] << endl;

            if (needle > p and fabs(max - v[needle]) < fabs(max - v[needle-1])) {
                q = needle;
                needle = (p + q) / 2;
            } else if (needle < q and fabs(max - v[needle]) < fabs(max - v[needle+1])) {
                p = needle;
                needle = (p + q) / 2;
            } else {
                break;
            }
        }
        int x = v[needle];

        double nf = sqrt(2*PI*v[i]) * pow((v[i] / E), v[i]);
        double xf = sqrt(2*PI*x) * pow((x / E), x);
        double nminusxf = sqrt(2*PI*(v[i]-x)) * pow(((v[i]-x) / E), (v[i]-x));
        double binomial = nf / (xf * nminusxf);

        //      cout << v[i] << " " << x << " " << binomial << endl;

        maximals.emplace_back(binomial, pair<int,int>(v[i], x));
    }

    sort(maximals.begin(), maximals.end(), [](const res &a, const res &b)->bool {
        return a.first > b.first;
    });

    cout << maximals[0].second.first << " " << maximals[0].second.second << endl;

    return 0;
}