题解
考虑到n取值个数很小。。
于是我们可以直接枚举n
然后算一下在这个n里面,出现这些东西的概率。。
取概率最大的就可以了
然后计算的时候,由于方案数巨大。。于是我们可以使用对数
————CQ zhangyu
CODE:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<map>
#include<cmath>
using namespace std;
typedef long long LL;
const LL N=100005;
LL m;
map<int,int> o;
LL cnt[N],cnt1;
double mx;
LL ans;
double jc[N];
double C (LL x,LL y)//在y个里面选择x个
{
return jc[y]-jc[y-x]-jc[x];
}
int main()
{
scanf("%lld",&m);
for (LL u=1;u<=m;u++)
{
LL x;
scanf("%lld",&x);
if (o[x]==0) o[x]=++cnt1;
cnt[o[x]]++;
}
mx=-1e10;
for (LL u=1;u<=m;u++) jc[u]=jc[u-1]+log(u);
for (LL n=10;n<=10000000;n*=10)
{
if (n<cnt1) continue;
double sum=0;
for (LL u=1;u<=cnt1;u++) sum=sum+log(n-u+1)-log(u);
sum=sum-log(n)*m;
LL lalal=m;
for (LL u=1;u<=cnt1;u++)
{
sum=sum+C(cnt[u],lalal);
lalal=lalal-cnt[u];
}
if (sum>mx)
{
mx=sum;
ans=n;
}
}
printf("%lld\n",ans);
return 0;
}