直接模拟取模。
暴力枚举。
一开始想复杂以为是质因数分解,因为只要求找出所有的 p a i r ( A , B ) , A B = N pair(A,B),AB=N pair(A,B),AB=N
显然可以暴力枚举 A A A。
贪心,显然取 a a a个最大的是最优的,因为越取多,数可能会变小,平均值也可能变小,接下只需特判这 a a a个数中最小的那个数 x x x的个数,如果小于 a a a,则 c n t = C ( t o t x , c n t x ) cnt=C(tot_x,cnt_x) cnt=C(totx,cntx)
如果 c n t x = = a cnt_x==a cntx==a,说明可以继续取 ∑ i = a m i n ( b , t o t x ) C ( t o t x , i ) \sum_{i=a}^{min(b,tot_x)} C(tot_x,i) ∑i=amin(b,totx)C(totx,i)
#include
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair
#define fi first
#define se second
#define pb push_back
#define il inline
map<ll,int>mp,g;
ll f[N];
ll C[N][N];
void solve(int n){
for(int i=1;i<=n;i++) C[i][0]=C[i][i]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<i;j++)
C[i][j]=C[i-1][j]+C[i-1][j-1];
}
int main(){
ll n;int a,b;
solve(50);
cin>>n>>a>>b;
map<ll,int>::reverse_iterator it;
for(int i=1;i<=n;i++){
cin>>f[i],mp[f[i]]++;
}
sort(f+1,f+n+1,greater<ll>());
ll cnt=0,x=0;
for(int i=1;i<=a;i++){
x+=f[i];
if(f[i]==f[a]) cnt++;
}
printf("%.6f\n",(double)x/a);
ll c=0;
x=f[a];
if(cnt<a) c=C[mp[x]][cnt];
else {
for(int i=a;i<=b&&mp[x]>=i;i++){
c+=C[mp[x]][i];
}
}
cout<<c<<endl;
return 0;
}