#include <bits/stdc++.h>
using namespace std;

// #include <boost/algorithm/string/join.hpp>
// using boost::algorithm::join;
//
// #include "boost/multi_array.hpp"
// boost::multi_array<int, 3> dp;
// dp.resize(boost::extents[10][9][8]);
//
// #include <boost/multiprecision/cpp_dec_float.hpp>  // quite slow
#include <boost/multiprecision/cpp_int.hpp>
namespace mp = boost::multiprecision; // mp::log10
// using bigint = boost::multiprecision::cpp_int;
using rational = mp::cpp_rational;

typedef long long ll;
typedef unsigned long long ull;
//typedef long double ld;

typedef map<int, int> mii;
typedef pair<int, int> pii;
typedef pair<double,double> pdd;
typedef set<int> si;
typedef set<ll> sll;
typedef vector<int> vi;
typedef vector<pair<int, int > > vii;
typedef vector<ll> vll;
typedef vector<double> vd;
typedef vector<vi> vvi;
typedef vector<vii> vvii;
typedef vector<vll> vvll;

//constexpr ll MOD = 1e9+7;
template<typename T>constexpr auto inf=numeric_limits<T>::max()/4;
constexpr int INF=inf<int>;
constexpr ll LINF=inf<ll>;

#define Sort(x) sort(begin(x),end(x))
#define Reverse(x) reverse(begin(x),end(x))
#define ABS(a,b) ((a)<(b)?(b)-(a):(a)-(b))
#define nbit(n) (1ull<<(n))
#define _ol3(_1,_2,_3,name,...)name
#define _rep(i,n)_repi(i,0,n)
#define _repi(i,a,b)for(int i=a,i##_l=(b);i<i##_l;++i)
#define REP(...) _ol3(__VA_ARGS__,_repi,_rep,)(__VA_ARGS__)
#define REPR(i,n) for(int i=n-1;i>=0;--i)
#define REPA(i,v) REP(i,(v).size())

// sort(begin(x), end(x), greater<ll>());
// lower_bound(a.begin(), a.end(), val): a[i] ≥ valである最左の位置
// upper_bound(a.begin(), a.end(), val): a[i] > valである最左の位置

// Returns minimum of a and b.
// If a is less b, a is set to b.
template<typename T>
T chmin(T& a, T b) {
  if (a > b) {
    a = b;
  }
  return a;
}

// Returns maximum of a and b.
// If a is less b, a is set to b.
template<typename T>
T chmax(T& a, T b) {
  if (a < b) {
    a = b;
  }
  return a;
}

template <typename T>
void dumpContents(const T& v, const string& msg)
{
  cerr << "### " << msg << " ###\n";
  for (const auto& x : v) {
    cerr << x << " ";
  }
  cerr << endl;
}

struct before_main_function {
  before_main_function() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout<<setprecision(20)<<fixed;
#define endl "\n"
  }
} before_main_function;

// ========== end of template ==========
// パスカルの三角形でcombinationをexactlyに求める
// SIZEは100程度まで
struct CombinationTable {
  vector<vll> dp;

  CombinationTable(int SIZE)
    : dp(SIZE+1) {
    dp[0] = {1};

    REP(i, 1, SIZE+1) {
      dp[i] = vll(i+1);

      dp[i][0] = 1;
      REP(j, 1, i) {
        dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
      }
      dp[i][i] = 1;
    }
  }

  ll operator()(ll a, ll b) const {
    if (b<0 || a<b) return 0;

    return dp[a][b];
  }
};

CombinationTable combi(55);

ll factorial_r(ll x) {
  assert(x>=0);
  ll ret = 1;
  while (x>1) {
    ret *= x;
    x--;
  }
  return ret;
}

ll combi_r(ll x, ll y) {
  assert(x>=0);
  assert(y>=0);
  assert(x>=y);
  ll ret = 1;
  for (int i=0; i<y; i++) {
    ret *= (x-i);
  }
  return ret/factorial_r(y);
}

int main(int argc, char** argv) {
  int N, A, B;
  cin >> N >> A >> B;
  vll V(N);
  map<ll, int> hist;
  for (auto& v : V) {
    cin >> v;
    hist[v]++;
  }
  Sort(V);

  // 累積和
  vll sum(N);
  sum[0] = V[0];
  REP(i, 1, N) {
    sum[i] = sum[i-1] + V[i];
  }

  map<rational, ll> ret;

  REP(k, A, B+1) {
    // 1) 上位k個を選ぶ
    ll x = V[N-k];
    int c = 0;
    REP(i, N-k, N) {
      if (V[i] != x) break;
      c++;
    }

    ll cases = combi(hist[x], c);
//cerr << "k " << cases << endl;
    rational avg = rational(1)/k*(sum[N-1] - (N-k-1>=0 ? sum[N-k-1] : 0));
    ret[avg] += cases;
  }

  //for (auto it = ret.begin(); it!=ret.end(); it = next(it)) {
  //cerr << "ret " << it->first << " " << it->second << endl;
  //}

  auto it = prev(ret.end());
  double v = static_cast<double>(it->first);
  cout << v << endl;
  cout << it->second << endl;

  return 0;
}

/* vim: set expandtab shiftwidth=2 softtabstop=2 : */


Measured memory_bytes: 512