题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609

答案就是随便选三条边的方案 - 不合法的方案。

不合法的方案就是算出 x+y = k 的方案数 g[ k ],对于每个长度 z ,不合法方案+=\( \sum\limits_{k=0}^{z}g[k] \)

注意 FFT 之后偶数项 k 算上了取长度为 k/2 的同一条边两遍的方案,要去重。

随便选三条边的 n*(n-1)*(n-2) 会把同一个 x , y , z 算6遍,而枚举 z 会把同一个 x , y , z 算两遍,所以要乘3。

注意减去的时候乘上长度为 z 的边的个数。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
#define ll long long
using namespace std;
const int N=1e5+5,M=(1<<18)+5;
const db pi=acos(-1);
int T,n,len,r[M],f[N];
struct cpl{db x,y;}a[M],I;
cpl operator+ (cpl a,cpl b){return (cpl){a.x+b.x,a.y+b.y};}
cpl operator- (cpl a,cpl b){return (cpl){a.x-b.x,a.y-b.y};}
cpl operator* (cpl a,cpl b){return (cpl){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
int Mx(int a,int b){return a>b?a:b;}
int rdn()
{int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret;
}
void fft(cpl *a,bool fx)
{for(int i=0;i<len;i++)if(i<r[i])swap(a[i],a[r[i]]);for(int R=2;R<=len;R<<=1){int m=R>>1;cpl wn=(cpl){ cos(pi/m),fx?-sin(pi/m):sin(pi/m) };for(int i=0;i<len;i+=R){cpl w=I;for(int j=0;j<m;j++,w=w*wn){cpl x=a[i+j],y=w*a[i+m+j];a[i+j]=x+y; a[i+m+j]=x-y;}}}if(!fx)return;for(int i=0;i<len;i++)a[i].x/=len;
}
int main()
{T=rdn();int mx=0; I.x=1;while(T--){n=rdn();for(int i=0;i<len;i++)a[i].x=a[i].y=0;for(int i=0;i<=mx;i++)f[i]=0;for(int i=1,u;i<=n;i++){u=rdn();mx=Mx(mx,u);a[u].x+=1; f[u]++;}for(len=1;len<=mx<<1;len<<=1);//mxfor(int i=0,j=len>>1;i<len;i++)r[i]=(r[i>>1]>>1)+((i&1)?j:0);fft(a,0);for(int i=0;i<len;i++)a[i]=a[i]*a[i];fft(a,1);ll sm=(ll)n*(n-1)*(n-2),ans=sm,lj=0;for(int i=0;i<=mx;i++){lj+=( (ll)(a[i].x+0.5)-((i&1)==0?f[i>>1]:0) )*3;ans-=lj*f[i];//*f[i]!!
    }printf("%.7f\n",(db)ans/sm);}return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10099775.html

hdu 4609 3-idiots——FFT相关推荐

  1. HDU 4609 3-idiots(FFT)

    3-idiots 思路 多项式卷积的经典应用了: 看样例一: 4 1 3 3 4 我们用多项式系数表示得到一个与aia_iai​有关的多项式:010210\ 1\ 0\ 2\ 10 1 0 2 1, ...

  2. hdu 4609 3-idiots(FFT计数)

    题目链接:hdu 4609 3-idiots 题意: 给你n条线段.问随机取三个,可以组成三角形的概率. 题解: FFT搞,具体可看kuangbin菊苣的详细题解:传送门 1 #include< ...

  3. HDU 4609 3-idiots

    HDU - 4609 思路: 记录每个木棍长度出现的次数,然后就可以用用类似多项式的乘法(专业术语:卷积,因为是下标和为一特定值的积的和(x+y=k),相当于在笛卡尔坐标系中将这条直线卷起来,故得名卷 ...

  4. 快速傅里叶变换应用之二 hdu 4609 3-idiots

    快速傅里叶变化有不同的应用场景,hdu4609就比较有意思.题目要求是给n个线段,随机从中选取三个,组成三角形的概率. 初始实在没发现这个怎么和FFT联系起来,后来看了下别人的题解才突然想起来:组合计 ...

  5. bzoj 3513: [MUTC2013]idiots FFT

    bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...

  6. HDU 4609 3-idiots FFT

    3-idiots 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4609 Description King OMeGa catched three m ...

  7. HDU 4609 FFT

    题目大意 给定n条边的边值,求任意取三条边能组成三角形的概率 这里概率 P = valid/tot tot = (n-2)*(n-1)*n/6是没问题的 valid表示合法的方式 先考虑,任意两条边组 ...

  8. 3-idiots HDU - 4609 FFT模板

    给N个木棍问任选三个可组合出三角形的概率 以前写的,整理整理存个档 //#pragma comment(linker, "/STACK:1024000000,1024000000" ...

  9. HDU 4609 3idiots

    第一道FFT,研究了kuangbin神的版子,发现想不太通,不过基本的意思都懂了,就是用一个数组的权和另一个数组的权求和,计算个数.题目中有不少坑点. #include <cstdio> ...

  10. HDU - 6975 Forgiving Matching FFT匹配字符串

    传送门 文章目录 题意: 思路: 题意: 给你两个串a,ba,ba,b长度分别为n,mn,mn,m,你需要输出m+1m+1m+1个数,第iii个数表示当允许有i−1i-1i−1个数可以不匹配时aaa中 ...

最新文章

  1. 技术图文:如何通过 LINQ 查找集合中的重复数据?
  2. 夏日php登录系统源码,夏日PHP企业管理系统 v0.1
  3. 入门NLP、实现语音识别和语音合成,用这个开源工具SoEasy | 英伟达NLP公开课
  4. Array和ArrayList区别
  5. QML中MouseArea元素的介绍
  6. linux100day(day6)--shell脚本简单逻辑
  7. 项目管理方面的几个.NET开源项目
  8. Spring Boot整合Druid的使用以及步骤
  9. 数据库SQL语言从入门到精通--Part 1--SQL语言概述
  10. ThinkpadX230解决叹号_Win7系统设备管理器下的“未知设备”
  11. 乌镇现场 | 倪光南:人工智能应该更好的为人类的服务
  12. gerund - 动名词
  13. CHERRY 键盘 alt 组合键失灵或开始菜单键失灵
  14. phpStudy的建站与踩坑,与微信公众号对接
  15. Java Scaner类详解_动力节点Java学院整理
  16. excel中时间加分钟运算公式
  17. android接入原生第三方登录(微信登录、QQ登录、新浪微博登录)
  18. flappy bird游戏源代码揭秘和下载后续---移植到html5网页浏览器
  19. matlab+GMT 画图操作——在画图区域-R外进行图例文字标注
  20. redo和undo日志

热门文章

  1. 【图像分割】基于matlab随机游走算法图像分割【含Matlab源码 149期】
  2. 【故障分析】基于matlab轴承故障仿真信号时域波形图+幅度谱图【含Matlab源码 123期】
  3. 【卡号识别】基于matlab CNN银行卡数字识别【含Matlab源码 030期】
  4. html获取视频时长,js获取本地视频时间长度
  5. thinkphp5 两个控制器传参数_Thinkphp5代码执行学习
  6. linux内核提高系统实时性,Linux操作系统实时性分析及改进策略
  7. 智能翻译android,离线翻译SDK,让智能小设备如虎添翼
  8. React入门(暂缓)
  9. Mac OS 加入域
  10. 【小窍门tip】oracle sequence 修改增量值