HDU4609 3-idiots fft
辣鸡的我写一题看一题题解,计数是大弱项。。。总是想不清楚
求所有ai+aj方案数,进行fft,得到num[0...len]
去掉i=j的情况,所有num[a[i]*2]--;由于i,j顺序不考虑,所有num[i]/=2
然后对a数组排序,从1...到n枚举ai,把ai看做最大的边
(1)ans+=sum[len-1]-sum[a[i]],因为把ai看做最大边,那么要找有多少种2边之和大于ai
(2)ans-=n-1,他自己和其余n-1条边组合会大于他,所以减掉
(2)ans-=(i-1)*(n-i); 一条边比他小,一条比他大,和比ai大,有这么多种非法情况
(3)ans-=(n-i)(n-i-1)*2,两条都比他大,和比ai大,有这么多种非法情况
最后ans/c(n,3)就是概率了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxl 100010using namespace std;const double pi=acos(-1.0);long long n,mx;
int len;
long long a[maxl];
long long num[maxl*4],sum[maxl*4];
long long ans;
struct complex
{double r,i;complex(double r1=0.0,double i1=0.0){r=r1;i=i1;}complex operator + (const complex &b){return complex(r+b.r,i+b.i);}complex operator - (const complex &b){return complex(r-b.r,i-b.i);}complex operator * (const complex &b){return complex(r*b.r-i*b.i,r*b.i+i*b.r);}
}x[maxl*4];inline void prework()
{scanf("%lld",&n);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);sort(a+1,a+1+n);mx=a[n];
}void change(complex y[],int len)
{int i,j;for(i=1,j=len/2;i<len-1;i++){if(i<j)swap(y[i],y[j]);int k=len/2;while(j>=k)j-=k,k/=2;if(j<k)j+=k;}
}void fft(complex y[],int len,int on)
{change(y,len);for(int l=2;l<=len;l<<=1){complex wn(cos(-on*2*pi/l),sin(-on*2*pi/l));for(int j=0;j<len;j+=l){complex w(1,0);for(int k=j;k<j+l/2;k++){complex u=y[k];complex t=w*y[k+l/2];y[k]=u+t;y[k+l/2]=u-t;w=w*wn;}}}if(on==-1)for(int i=0;i<len;i++)y[i].r/=len;
}inline void mainwork()
{len=1;while(len<2*mx+1)len<<=1;for(int i=0;i<len;i++)x[i]=complex(0.0,0.0);for(int i=1;i<=n;i++)x[a[i]].r++;fft(x,len,1);for(int i=0;i<len;i++)x[i]=x[i]*x[i];fft(x,len,-1);for(int i=0;i<len;i++)num[i]=(long long)(x[i].r+0.5);for(int i=1;i<=n;i++)num[a[i]*2]-=1;for(int i=0;i<len;i++)num[i]/=2;for(int i=1;i<len;i++)sum[i]=sum[i-1]+num[i];ans=0;for(int i=1;i<=n;i++){ans+=sum[len-1]-sum[a[i]];ans-=n-1;ans-=(i-1)*(n-i);ans-=(n-i)*(n-i-1)/2;}
}inline void print()
{double ff=1.0*ans/(1.0*n*(n-1)*(n-2)/6);printf("%.7f\n",ff);
}int main()
{int t;scanf("%d",&t);for(int i=1;i<=t;i++){prework();mainwork();print();}return 0;
}
HDU4609 3-idiots fft相关推荐
- bzoj 3513: [MUTC2013]idiots FFT
bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...
- BZOJ 3513: [MUTC2013]idiots [FFT]
统计每种长度的木棒数量,先计算出两根棒子能构成的长度,想到卷积.1.拿这个序列卷积自己 2.计算重算的部分,首先是一条边自己和自己的这种情况,另一种是(i,j)和(j,i)这种形式.第一种,可以枚举读 ...
- 解题报告(二)E、(BZOJ3513) [MUTC2013] idiots(生成函数 + FFT + 组合计数)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- HDU4609 FFT
关于这道题请移步kuangbin爷的blog:http://www.cnblogs.com/kuangbin/archive/2013/07/24/3210565.html 感觉我一辈子也不能写出这么 ...
- hdu4609 3idiots 三角形计数 FFT
直接上代码 #include <iostream> #include <cstdio> #include <cmath> #include <cstring& ...
- bzoj 3513: [MUTC2013]idiots【生成函数+FFT】
想了好长时间最后发现真是石乐志 第一反应就是两边之和大于第三边,但是这个东西必须要满足三次-- 任意的两边之和合通过生成函数套路+FFT求出来(记得去掉重复选取的),然后这任意两边之和大于任意第三边可 ...
- 2019.01.02 bzoj3513: [MUTC2013]idiots(fft)
传送门 fftfftfft经典题. 题意简述:给定nnn个长度分别为aia_iai的木棒,问随机选择3个木棒能够拼成三角形的概率. 思路:考虑对于木棒构造出生成函数然后可以fftfftfft出两个木 ...
- [hdu4609]3-idiots(快速傅利叶变换FFT)
题目名字是三个制杖- [题意] 有T组数据 每组数据给出n条线段,问任意取三条,可以组成三角形的概率 [输入] 开头一行输入T(T<=10) 下来T组数据,每组数据第一行输入一个n(3<= ...
- HDU 4609 3-idiots FFT
3-idiots 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4609 Description King OMeGa catched three m ...
- 快速傅里叶变换(FFT)相关内容汇总
(原稿:https://paste.ubuntu.com/p/yJNsn3xPt8/) 快速傅里叶变换,是求两个多项式卷积的算法,其时间复杂度为$O(n\log n)$,优于普通卷积求法,且根据有关证 ...
最新文章
- vue 怎么在字符串中指定位置插入字符_Vue数组变更方法
- Windows Phone 7监测网络环境变化
- php框架laravel:数据库建立:artisan
- 【ESSD技术解读】ESSD Auto PL规格,引领IO性能弹性新方向
- android---am命令
- 做了个专为“数据分析师”打造的刷题平台!
- boost跨平台 c++_跨平台C++整数类型 之一 固定宽度整数(boost和C++11)
- 用TextPaint来绘制文字
- c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例
- Oracle中的数据库对象
- python 中 print 函数用法总结
- 等线PCB布局的13条基本规则
- 未来机器人背景的AI人工智能PPT模板
- [置顶] 以盛唐气象,浇胸中块垒:唐诗与宋词学习笔记汇总目录
- 速率bps(kbps、Mbps)和每秒字节传输B/s(KB/s、MB/s)的关系如下
- 敏捷开发思想之拥抱变化
- 391、Java框架46 -【Hibernate - 查询HQL、查询Criteria、查询标准SQL】 2020.10.19
- office2016首要事项
- 第06周 预习:接口与多态
- 4.19黄金白银TD纸白银行情如何把握,最新行情策略
热门文章
- python正则表达式match方法_Python match()函数:匹配正则表达式
- 每日excel学习之分类汇总和数据有效性
- Stacked Hourglass Networks简析
- cubieboard刷机
- C# WinForm 使用SMS接口发送手机验证码+图形验证码+IP限制
- 助力自己在金融领域中更加游刃有余的人大与加拿大女王大学金融硕士项目你读到了吗?
- 一般熟练盲打需要多久_练习拼音打字练到[盲打]的境界一般需要多久(时间)?...
- S5P4418启动镜像分析
- JavaScript实现打字机效果
- 行人属性识别:Grouping Attribute Recognition for Pedestrian with Joint Recurrent Learning