import std.stdio, std.string, std.conv, std.range, std.array, std.algorithm;
import std.uni, std.math, std.container, std.typecons, std.typetuple;
import core.bitop, std.datetime;

void main(){
    int N, A, B;
    readVars(N, A, B);
    auto v = readln.split.to!(long[]);

    auto h1 = new long[](N/2 + 1);
    auto c1 = new long[](N/2 + 1);
    auto h2 = new long[](N - N/2 + 1);
    auto c2 = new long[](N - N/2 + 1);
    dfs(v, 0, N/2, 0, 0, h1, c1);
    dfs(v, N/2, N, 0, 0, h2, c2);

    long max_v = 0, max_num = 0;
    long cnt = 0;

    foreach(i ; 0 .. h1.length){
        foreach(j ; 0 .. h2.length){
            if (A <= (i + j) && (i + j) << B) {
                auto tot = h1[i] + h2[j];

                if (max_v == 0){
                    max_v = tot;
                    max_num = i + j;
                    cnt = c1[i] * c2[j];
                    continue;
                }

                if (max_v * (i + j) < tot * max_num){
                    cnt = c1[i] * c2[j];
                    max_v = tot;
                    max_num = i + j;
                } else if (max_v * (i + j) == tot * max_num){
                    cnt += c1[i] * c2[j];
                }
            }
        }
    }

    auto ans = 1. * max_v / max_num;
    writefln("%.8f", ans);
    writeln(cnt);
}

void dfs(long[] v, int idx, int end, int cnt, long tot, long[] h, long[] c){
    if (idx == end) {
        if (h[cnt] < tot) {
            h[cnt] = tot;
            c[cnt] = 1;
        } else if (h[cnt] == tot) {
            c[cnt]++;
        }
        return;
    }

    dfs(v, idx + 1, end, cnt + 1, tot + v[idx], h, c);
    dfs(v, idx + 1, end, cnt, tot, h, c);
}

void readVars(T...)(auto ref T args){
    auto line = readln.split;
    foreach(ref arg ; args){
        arg = line.front.to!(typeof(arg));
        line.popFront;
    }
    if(!line.empty){
        throw new Exception("args num < input num");
    }
}