HDU 4709 3-idiots FFT 多项式
http://acm.hdu.edu.cn/showproblem.php?pid=4609
给一堆边,求这一堆边随便挑三个能组成三角形的概率。
裸fft,被垃圾题解坑了还以为很难。
最长的边的长度小于其余两边之和是组成三角形的充要条件,fft搞搞就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<complex>
using namespace std;
#define LL long long
const int maxn=;
double Pi;
typedef complex< double >cd;
cd b[maxn]={};
LL a[maxn]={},cnt[maxn]={};
int bel[maxn]={},s,bt;
void getit(){for(int i=;i<s;++i)bel[i]=(bel[i>>]>>)|((i&)<<(bt-));}
void fft(cd *c,int n,int dft){
for(int i=;i<n;++i)if(bel[i]>i)swap(c[i],c[bel[i]]);
for(int step=;step<n;step<<=){
cd w=cd(cos(Pi/(double)step),sin(Pi/(double)step)*(double)dft);
for(int j=;j<n;j+=(step<<)){
cd z=cd(1.0,);
for(int i=j;i<j+step;++i){
cd x=c[i],y=c[i+step]*z;
c[i]=x+y;c[i+step]=x-y;
z=z*w;
}
}
}
if(dft==-)for(int i=;i<n;++i)c[i]/=n;
}
int main(){
Pi=acos(-1.0);
int T;scanf("%d",&T);
while(T-->){
int n;scanf("%d",&n);
memset(cnt,,sizeof(cnt));
for(int i=;i<n;++i){scanf("%d",&a[i]);cnt[a[i]]+=;} sort(a,a+n); int siz=a[n-]+;
for(int i=;i<siz;++i)b[i]=cd(cnt[i],);
for(int i=siz;i<s;++i)b[i]=cd(,); siz*=; bt=; s=; for(;s<siz;++bt)s<<=; getit();
fft(b,s,);
for(int i=;i<s;++i)b[i]=b[i]*b[i];
fft(b,s,-);
for(int i=;i<=s;++i)cnt[i]=(LL)(b[i].real()+0.5);
for(int i=;i<s;++i)b[i]=cd(,); s=a[n-]*;
for(int i=;i<n;++i)--cnt[a[i]*];
for(int i=;i<=s;++i)cnt[i]/=;
for(int i=;i<=s;++i)cnt[i]+=cnt[i-]; LL ans=;
for(int i=;i<n;++i){
ans+=cnt[s]-cnt[a[i]];
ans-=(LL)(n--i)*i;
ans-=n-;
ans-=(LL)(n--i)*(n-i-)/;
}
LL sum=(LL)n*(n-)*(n-)/;
printf("%.7f\n",(double)(ans)/(double)(sum));
}
return ;
}
HDU 4709 3-idiots FFT 多项式的更多相关文章
- 51NOD 1258 序列求和 V4 [任意模数fft 多项式求逆元 伯努利数]
1258 序列求和 V4 题意:求\(S_m(n) = \sum_{i=1}^n i^m \mod 10^9+7\),多组数据,\(T \le 500, n \le 10^{18}, k \le 50 ...
- bzoj 3513: [MUTC2013]idiots FFT
bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...
- hdu 4709:Herding(叉积求三角形面积+枚举)
Herding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 学习数论 HDU 4709
经过杭师大校赛的打击,明白了数学知识的重要性 开始学习数论,开始找题练手 Herding HDU - 4709 Little John is herding his father's cattles. ...
- hdu 5730 Shell Necklace [分治fft | 多项式求逆]
hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...
- HDU 1402 A * B Problem Plus 快速傅里叶变换 FFT 多项式
http://acm.hdu.edu.cn/showproblem.php?pid=1402 快速傅里叶变换优化的高精度乘法. https://blog.csdn.net/ggn_2015/artic ...
- hdu 5142 NPY and FFT
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5142 NPY and FFT Description A boy named NPY is learn ...
- HDU 4609 3-idiots(FFT)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给出n个正整数(数组A).每次随机选出三个数.问这三个数能组成三角形的概率为多大? 思路: ...
- hdu - 4709 - Herding
题意:给出N个点的坐标,从中取些点来组成一个多边形,求这个多边形的最小面积,组不成多边形的输出"Impossible"(测试组数 T <= 25, 1 <= N < ...
随机推荐
- oracle按照in的顺序进行排序
oracle按照in的顺序进行排序 ,,) order by case id end;
- Kafka 0.8 如何创建topic
1. 操作命令 bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions ...
- git 查看一个分支是否被合并过
1.查看该分支的提交历史 git log 分支名 2.git log master |grep comitid 如果包含,就证明已经合并过 3.git branch -d 分支名,如果报错,就是没合并 ...
- 浏览器存储:cookie
Cookie是什么:cookie是指存储在用户本地终端上的数据,同时它是与具体的web页面或者站点相关的.Cookie数据会自动在web浏览器和web服务器之间传输,也就是说HTTP请求发送时,会把保 ...
- MYSQL查询重复记录的方法
select * from hengtu_demandpush a where (a.did,a.mid) in (select did,mid from hengtu_demandpush grou ...
- 记一道有趣的Twitter面试题
微信上的“程序员的那些事”想必是很多码农们关注的公众账号之一,我也是其粉丝,每天都会看看里面有没有什么趣事,前段时间“程序员的那些事”分享了一篇博文<我的Twitter技术面试失败了>挺有 ...
- 使用Cobbler批量部署Linux和Windows:CentOS/Ubuntu批量安装(二)
通过前面服务端的部署,已经配置好了 Cobbler Server 端,接下来开始进行 CentOS/Ubuntu 的批量安装,在进行 CentOS/Ubuntu 批量安装时,也需要通过Cobbler来 ...
- 使用Docx4j创建word文档
原文标题:Creating Word documents with Docx4j 原文链接:http://blog.iprofs.nl/2012/09/06/creating-word-documen ...
- 分析占用了大量CPU处理时间的是Java进程中哪个线程
下面是详细步骤: 1. 首先确定进程的 ID ,可以使用 jps -v 或者 top 命令直接查看 2. 查看该进程中哪个线程占用大量 CPU,执行 top -H -p [PID] 结果如下: 可以发 ...
- php ++测试
2014年4月27日 12:17:47 结论暂时没有组织语言去表述,但是看看测试结果大家都会明白的 $x = 1; $y = empty($x) ? 3 : $x++; var_dump($x,$y) ...