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] }
题意:从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); } }
相关文章推荐
- HDU 4609 3-idiots (FFT)
- HDU 4609 3-idiots(FFT优化 + 计数方法)——2013 Multi-University Training Contest 1
- hdu 4609 3-idiots 【FFT快速傅立叶变换】
- HDU 4609 3-idiots(FFT,计数)
- HDU 4609 3-idiots(组合数学+FFT)
- HDU 4609 3-idiots (FFT)
- HDU 4609 3-idiots(FFT优化 + 计数方法)——2013 Multi-University Training Contest 1
- FFT(快速傅里叶变换):HDU 4609 3-idiots
- HDU 4609 3-idiots(FFT)
- HDU 4609 3-idiots三个智障 FFT+组合计数
- hdu 4609 3-idiots FFT
- hdu 4609 3-idiots [FFT计数]【数学】
- HDU 4609 3-idiots (FFT)
- HDU 4609 3-idiots (FFT)
- HDU 4609 3-idiots (FFT)
- 【HDU】4609 3-idiots 【FFT】
- hdu 4609 3-idiots (FFT)
- HDU 4609 3-idiots FFT入门
- HDU 4609 3-idiots FFT
- HDU 4609 3-idiots(FFT)