#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_ITM_MAX		50										// 最大品物数

// 内部構造体 - 品物情報
typedef struct Itm {
	long long mlVal;											// 価値
	int miCnt;													// 数
} Itm;

// 内部変数
static Itm sz1Itm[D_ITM_MAX];									// 品物
static int siICnt;												// 品物数
static int siISMin;												// 品物選択数 - 最小
static int siISMax;												// 品物選択数 - 最大
static long long sl2Comb[D_ITM_MAX + 5][D_ITM_MAX + 5];			// 組み合わせ表[n][m] = nCm

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpT, *szpFpA;
#endif

// ソート関数 - 品物 - 価値降順
int
fSortFnc(
	const void *pzpVal1			// <I> 値１
	, const void *pzpVal2		// <I> 値２
)
{
	Itm *lzpVal1 = (Itm *)pzpVal1;
	Itm *lzpVal2 = (Itm *)pzpVal2;

	// 価値降順
	if (lzpVal1->mlVal > lzpVal2->mlVal) {
		return(-1);
	}
	else if (lzpVal1->mlVal < lzpVal2->mlVal) {
		return(1);
	}

	return 0;
}

// 品物 - 数セット
int
fSetCnt(
)
{
	int i;

	// 数セット
	int liNo = 0;
	for (i = 1; i < siICnt; i++) {
		if (sz1Itm[i].mlVal == sz1Itm[liNo].mlVal) {	// 一致
			sz1Itm[liNo].miCnt++;
		}
		else {											// 不一致
			liNo++;
			sz1Itm[liNo].mlVal = sz1Itm[i].mlVal;
		}
	}

	// 品物数更新
	siICnt = liNo;

	return 0;
}

// 組み合わせ表の作成
int
fMakeComb(
)
{
	int i, j;

	for (i = 0; i <= siICnt; ++i) {
		for (j = 0; j <= i; ++j) {
			if (j == 0 || j == i) {
				sl2Comb[i][j] = 1;
			}
			else {
				sl2Comb[i][j] = sl2Comb[i - 1][j - 1] + sl2Comb[i - 1][j];
			}
		}
	}

	return 0;
}

// 実行メイン
int
fMain(
	int piTNo					// <I> テスト番号 1～
)
{
	int i;
	char lc1Buf[1024], lc1Out[1024];

	// テストファイルオープン
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
	szpFpT = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#endif

	// 品物数・品物選択数取得
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif
	sscanf(lc1Buf, "%d%d%d", &siICnt, &siISMin, &siISMax);

	// 品物取得
	for (i = 0; i < siICnt; i++) {
#ifdef D_TEST
		fscanf(szpFpT, "%lld", &sz1Itm[i].mlVal);
#else
		fscanf(stdin, "%lld", &sz1Itm[i].mlVal);
#endif
		sz1Itm[i].miCnt = 1;
	}
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif

	// 品物 - ソート
	qsort(sz1Itm, siICnt, sizeof(Itm), fSortFnc);

	// 最大平均 - 取得
	long long llSum = 0;
	for (i = 0; i < siISMin; i++) {
		llSum += sz1Itm[i].mlVal;
	}
	double ldAvg = (double)llSum / (double)siISMin;

	// 最大平均 - 出力
	sprintf(lc1Out, "%.6lf\n", ldAvg);
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, lc1Out)) {
		siRes = -1;
	}
#else
	printf("%s", lc1Out);
#endif

	// 組み合わせ表の作成
	fMakeComb();

	// 品物 - 数セット
	fSetCnt();

	long long llPtn = 0;

	// 最大平均時の品物数のパターン
	if (sz1Itm[0].miCnt <= siISMin) {			// １種類のみ

		// 対象の品物取得
		int liCnt = siISMin - sz1Itm[0].miCnt;		// 残数
		int liNo = 1;
		while (liCnt >= sz1Itm[liNo].miCnt) {
			liCnt -= sz1Itm[liNo].miCnt;
			liNo++;
		}

		// パターン数
		llPtn = sl2Comb[sz1Itm[liNo].miCnt][liCnt];
	}
	else {										// ２種類以上

		// 品物数
		int liCnt = 0;
		if (siISMax < sz1Itm[0].miCnt) {
			liCnt = siISMax;
		}
		else {
			liCnt = sz1Itm[0].miCnt;
		}

		// パターン数加算
		for (i = siISMin; i <= siISMax; i++) {
			llPtn += sl2Comb[sz1Itm[0].miCnt][i];
		}
	}

	// パターン数の出力
	sprintf(lc1Out, "%lld\n", llPtn);
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, lc1Out)) {
		siRes = -1;
	}
#else
	printf("%s", lc1Out);
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpT);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", piTNo);
	}
	else {
		printf("NG %d\n", piTNo);
	}
#endif

	return 0;
}

int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		fMain(i);
	}
#else
	fMain(0);
#endif

	return 0;
}



Measured memory_bytes: 256