您的位置:首页 > 大数据 > 物联网

hdu 4609: 3-idiots (FFT)

2017-09-14 16:13 204 查看
题目链接

题意:从N个数中,选出三个两两不同的数,求这三个数能够作为一个三角形的三边长的概率。

题解:用一个数组num[]记录大小为 i 的数出现的次数,通过 num[] 卷 num[] 得到 num2[],用 num2[i] 表示从N个数中选两个数,这两个数的和为 i 的情况数。然后考虑对三角形的计数,正向不易得到ans,可以考虑三个数不能构成三角形的情况数,那么可以对所有的非法情况根据其中最大一个数来进行分类。最后总的情况数 sum=sigma{ a[i]*presum_num2[i] }

LL a[FFT_MAXN|1];
LL num[FFT_MAXN|1];
LL num2[FFT_MAXN|1];
LL sum[FFT_MAXN|1];

int main()
{
int T;
scanf("%d",&T);
FFT::init();
while(T--)
{
int n;
LL maxL=0;
memset(num,0,sizeof(num));
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
maxL=max(maxL,a[i]);
num[a[i]]++;
}
FFT::convo(num,maxL,num,maxL,num2);
for(int i=0;i<n;i++) num2[a[i]<<1]--;
for(int i=1;i<=maxL*2;i++)
num2[i]/=2,sum[i]=sum[i-1]+num2[i];
LL q=(LL)n*(n-1)*(n-2)/6;
LL p=q;
for(int i=2;i<=maxL;i++)
p-=num[i]*sum[i];
printf("%.7lf\n",(double)p/q);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: