// #include <bits/stdc++.h>

// using namespace std;

// using VI = vector<int>;
// using VVI = vector<VI>;
// using VB = vector<bool>;
// using VVB = vector<VB>;
// using VS = vector<string>;
// using PII = pair<int, int>;
// using VPII = vector<PII>;
// using VL = vector<long long>;
// using VVL = vector<VL>;

// #define sz(var) (int)var.size()
// #define REP(var, start, end) for(int var = start; var < (int)end; ++var)
// #define CLEAR(var, with) memset(var, with, sizeof(var))
// #define LL long long
// #define ULL unsigned long long

// ULL comb[101][101];
// void precalc(int n)
// {
//     for(int i = 0; i <= n; ++i)
//     {
//         comb[i][0] = comb[i][i] = 1;
//         for(int j = 1; j < n; ++j)
//             comb[i][j] = comb[i - 1][j] + comb[i - 1][j - 1];
//     }
// }

// int main()
// {
// 	ios_base::sync_with_stdio(false);
// 	cin.tie(0);
// #ifndef ONLINE_JUDGE
// 	freopen("tmp.in", "r", stdin);
// //	freopen("tmp.out", "w", stderr);
// #endif
//     int N, A, B;
//     cin >> N >> A >> B;


//     VL Item(N, 0);
//     REP(i, 0, N) cin >> Item[i];

//     precalc(N);    
//     sort(Item.begin(), Item.end(), greater<LL>());

//     double max_avg = (double)accumulate(Item.begin(), Item.begin() + A, 0ll) / A;
    
//     LL smallest = Item[A - 1];
//     int tot = count(Item.begin(), Item.end(), smallest);
//     int smallestInRange = count(Item.begin(), Item.begin() + A, smallest);

//     cout.precision(10);
//     cout << fixed << max_avg << endl;
//     if(Item[0] != smallest)
//         cout << comb[tot][smallestInRange] << endl;
//     else {
//         LL ret = 0;
//         for(int i = A; i <= B; ++i)
//             ret += comb[tot][i];
//         cout << ret << endl;
//     }
    
// 	return 0;
// }

#include <bits/stdc++.h>
 
using namespace std;
 
using VI = vector<int>;
using VVI = vector<VI>;
using VB = vector<bool>;
using VVB = vector<VB>;
using VS = vector<string>;
using PII = pair<int, int>;
using VPII = vector<PII>;
using VL = vector<long long>;
using VVL = vector<VL>;
 
#define sz(var) (int)var.size()
#define REP(var, start, end) for(int var = start; var < (int)end; ++var)
#define CLEAR(var, with) memset(var, with, sizeof(var))
#define LL long long
#define ULL unsigned long long
 
// n개중에서 k 를 고르는 Combination table을 미리 세팅한다.
// C[n][k] -> nCk
ULL Comb[51][51];
void combination_table(int n)
{
    for(int i = 0; i <= n; ++i)
        for(int j = 0; j <= i; ++j)
        {
            if(j == 0 || j == i)
                Comb[i][j] = 1ll;
            else
                Comb[i][j] = Comb[i - 1][j - 1] + Comb[i - 1][j];
        }
}
 
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
#ifndef ONLINE_JUDGE
	//freopen("tmp.in", "r", stdin);
//	freopen("tmp.out", "w", stderr);
#endif
    int N, A, B;
    cin >> N >> A >> B;
 
    VL items(N, 0);
    REP(i, 0, N) cin >> items[i];
 
    combination_table(N);
    sort(items.begin(), items.end(), greater<LL>());
 
    double max_avg = (double)accumulate(items.begin(), items.begin() + A, 0ll) / A;
    
    LL smallest = items[A - 1];
    int numSmallest = count(items.begin(), items.end(), smallest);

	cout.precision(10);
    cout << fixed << max_avg << endl;

    LL cnt = 0ll;
    // 1. items[0] == items[A - 1] 인 경우    
    if(items[0] == smallest)
        cnt += accumulate(Comb[numSmallest] + A, Comb[numSmallest] + B + 1, 0ll);
    else {
        int numSub = count(items.begin(), items.begin() + A, smallest);
        cnt += Comb[numSmallest][numSub];
    }
 
    cout << cnt << endl;
 
	return 0;
}

Measured memory_bytes: 256