hdu 4609 3-idiots——FFT
题目: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+,M=(<<)+;
- const db pi=acos(-);
- 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=;bool fx=;char ch=getchar();
- while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
- while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
- return fx?ret:-ret;
- }
- void fft(cpl *a,bool fx)
- {
- for(int i=;i<len;i++)
- if(i<r[i])swap(a[i],a[r[i]]);
- for(int R=;R<=len;R<<=)
- {
- int m=R>>;
- cpl wn=(cpl){ cos(pi/m),fx?-sin(pi/m):sin(pi/m) };
- for(int i=;i<len;i+=R)
- {
- cpl w=I;
- for(int j=;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=;i<len;i++)a[i].x/=len;
- }
- int main()
- {
- T=rdn();int mx=; I.x=;
- while(T--)
- {
- n=rdn();
- for(int i=;i<len;i++)a[i].x=a[i].y=;
- for(int i=;i<=mx;i++)f[i]=;
- for(int i=,u;i<=n;i++)
- {
- u=rdn();mx=Mx(mx,u);
- a[u].x+=; f[u]++;
- }
- for(len=;len<=mx<<;len<<=);//mx
- for(int i=,j=len>>;i<len;i++)r[i]=(r[i>>]>>)+((i&)?j:);
- fft(a,);
- for(int i=;i<len;i++)a[i]=a[i]*a[i];
- fft(a,);
- ll sm=(ll)n*(n-)*(n-),ans=sm,lj=;
- for(int i=;i<=mx;i++)
- {
- lj+=( (ll)(a[i].x+0.5)-((i&)==?f[i>>]:) )*;
- ans-=lj*f[i];//*f[i]!!
- }
- printf("%.7f\n",(db)ans/sm);
- }
- return ;
- }
hdu 4609 3-idiots——FFT的更多相关文章
- HDU 4609 3-idiots(FFT)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给出n个正整数(数组A).每次随机选出三个数.问这三个数能组成三角形的概率为多大? 思路: ...
- HDU 4609 3-idiots (组合数学 + FFT)
题意:给定 n 条边,问随机选出 3 条边,能组成三角形的概率是多少. 析:答案很明显就是 能组成三角形的种数 / (C(n, 3)).现在的问题是怎么求能组成三角形的种数. 这个博客说的非常清楚了 ...
- HDU 4609 3-idiots ——(FFT)
这是我接触的第一个关于FFT的题目,留个模板. 这题的题解见:http://www.cnblogs.com/kuangbin/archive/2013/07/24/3210565.html. FFT的 ...
- hdu 4609: 3-idiots (FFT)
题目链接 题意:从N个数中,选出三个两两不同的数,求这三个数能够作为一个三角形的三边长的概率. 题解:用一个数组num[]记录大小为 i 的数出现的次数,通过 num[] 卷 num[] 得到 num ...
- 解题:HDU 4609 Three Idiots
题面 要求组合的方法显然我们需要对桶卷积,即设$F(x)=\sum\limits_{i=1}^{maxx}x^{cnt[i]}$,然后我们初步的先把$F^2(x)$卷出来,表示选两条边.然后我们发现如 ...
- hdu 4609 3-idiots [fft 生成函数 计数]
hdu 4609 3-idiots 题意: 给出\(A_i\),问随机选择一个三元子集,选择的数字构成三角形的三边长的概率. 一开始一直想直接做.... 先生成函数求选两个的方案(注意要减去两次选择同 ...
- 快速傅里叶变换应用之二 hdu 4609 3-idiots
快速傅里叶变化有不同的应用场景,hdu4609就比较有意思.题目要求是给n个线段,随机从中选取三个,组成三角形的概率. 初始实在没发现这个怎么和FFT联系起来,后来看了下别人的题解才突然想起来:组合计 ...
- bzoj 3513: [MUTC2013]idiots FFT
bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...
- hdu 4609 3-idiots <FFT>
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 给定 N 个正整数, 表示 N 条线段的长度, 问任取 3 条, 可以构成三角形的概率为多 ...
- HDU 4609 FFT模板
http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给你n个数,问任意取三边能够,构成三角形的概率为多少. 思路:使用FFT对所有长度的个数进行卷积(\ ...
随机推荐
- 并发-HashMap和HashTable源码分析
HashMap和HashTable源码分析 参考: https://blog.csdn.net/luanlouis/article/details/41576373 http://www.cnblog ...
- scala学习手记31 - Trait
不知道大家对java的接口是如何理解的.在我刚接触到接口这个概念的时候,我将接口理解为一系列规则的集合,认为接口是对类的行为的规范.现在想来,将接口理解为是对类的规范多少有些偏颇,更恰当些的观点应该是 ...
- yii2:引用项目外的文件或类
yii2:引用项目外的文件或类 以项目:frontend为例,文件目录如下: frontend/ frontend/controllers frontend/views fronte ...
- python 邮件发送实例
#!/usr/bin/env python # -*- coding: utf-8 -*- from email.header import Header from email.mime.text i ...
- JAVA Eclipse 快捷键
一. 最常见的: a) 内容提示:Alt + / b) 快速修复:Ctrl + 1 c) 导包:Ctrl + shift + O d) 格式化代码块 ...
- Ceph配置项动态变更机制浅析
转自:https://www.ustack.com/blog/ceph%e9%85%8d%e7%bd%ae%e9%a1%b9%e5%8a%a8%e6%80%81%e5%8f%98%e6%9b%b4%e ...
- IOS-将任意对象存进数据库
model // // HMShop.h // 将任意对象存进数据库 // // Created by apple on 14/11/20. // Copyright (c) 2014年 heima. ...
- volatile关键字与内存可见性
前言 首先,我们使用多线程的目的在于提高程序的效率,但是如果使用不当,不仅不能提高效率,反而会使程序的性能更低,因为多线程涉及到线程之间的调度.CPU上下文的切换以及包括线程的创建.销毁和同步等等,开 ...
- 全局ajax事件
必须当页面上存在任何ajax请求的时候都将触发这些特定的全局ajax处理函数. 如果在jQuery.ajaxSetup()中的global属性设置成true,那么这些全局函数将会在每一个ajax上面都 ...
- asp.net获取URL和IP地址
(转自:http://www.cnblogs.com/JuneZhang/archive/2010/11/26/1888863.html) HttpContext.Current.Request.Ur ...