hdu 4609 3-idiots
http://acm.hdu.edu.cn/showproblem.php?pid=4609
FFT 不会 找了个模板
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std; typedef long long ll;
typedef pair<double,double>ppd;
const double PI = acos(-1.);
const int MAXL = (1 << 18)+100;
int a[MAXL],b[MAXL];
ll c[MAXL];
ppd A[MAXL],B[MAXL],C[MAXL],T[MAXL];
int id,ln;
void fill0(int m,int d,int *s,ppd *P)
{
if (m == ln)
P[d] = make_pair(s[id++],0.0);
else
{
fill0(m<<1,d,s,P);
fill0(m<<1,d+m,s,P);
}
} void fill1(int m,int d,ppd *C,ppd *P)
{
if (m == ln) P[d] = C[id++];
else
{
fill1(m<<1,d,C,P);
fill1(m<<1,d+m,C,P);
}
} void fft(double oper,ppd *P)
{
for (int d = 0;(1 << d) < ln;++d)
{
int m = (1 << d);
double p0 = PI / m * oper;
double sinp0 = sin(p0);
double cosp0 = cos(p0);
for (int i = 0;i < ln;i += (m << 1))
{
double sinp = 0;
double cosp = 1;
for (int j = 0;j < m;++j)
{
double ta = cosp * P[i+j+m].first - sinp*P[i+j+m].second;
double tb = cosp * P[i+j+m].second + sinp * P[i+j+m].first;
P[i+j+m].first = P[i+j].first - ta;
P[i+j+m].second = P[i+j].second - tb;
P[i+j].first += ta;
P[i+j].second += tb;
double tsinp = sinp;
sinp = sinp * cosp0 + cosp * sinp0;
cosp = cosp * cosp0 -tsinp * sinp0;
}
}
}
}
void polyMul(int *a,int *b,ll *c,int n)
{
ln=(1<<18);
while((ln>>2)>=n) ln=ln>>1;
id = 0;
fill0(1,0,a,A);
fft(1.0,A);
id = 0;
fill0(1,0,b,B);
fft(1.0,B);
for (int i = 0;i < ln;++i)
{
C[i].first = A[i].first * B[i].first - A[i].second * B[i].second;
C[i].second = A[i].first * B[i].second + A[i].second * B[i].first;
}
id = 0;
fill1(1,0,C,T);
fft(-1.0,T);
for (int i = 0;i < ln;++i)
c[i] = ll(T[i].first / ln + 0.1);
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("1010.in","r",stdin);
//freopen("my.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
int m;
scanf("%d",&m);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n=0;
for(int i=0;i<m;++i)
{
int tmp=0;
scanf("%d",&tmp);
n=max(n,tmp);
++a[tmp];
++b[tmp];
}
++n;
polyMul(a,b,c,n);
for(int i=0;i<n;++i)
if(a[i])
c[i+i]-=a[i];
for(int i=0;i<ln;++i)
c[i]=c[i]>>1; double tmp=0.0;
double t=0;
for(int i=0;i<n;++i)
{
t+=c[i];
tmp+=(a[i]*t);
}
double sum=(1.0*m*(m-1)*(m-2)/2/3);
printf("%.7lf\n",(sum-tmp)/sum);
}
return 0;
}
hdu 4609 3-idiots的更多相关文章
- 解题:HDU 4609 Three Idiots
题面 要求组合的方法显然我们需要对桶卷积,即设$F(x)=\sum\limits_{i=1}^{maxx}x^{cnt[i]}$,然后我们初步的先把$F^2(x)$卷出来,表示选两条边.然后我们发现如 ...
- 快速傅里叶变换应用之二 hdu 4609 3-idiots
快速傅里叶变化有不同的应用场景,hdu4609就比较有意思.题目要求是给n个线段,随机从中选取三个,组成三角形的概率. 初始实在没发现这个怎么和FFT联系起来,后来看了下别人的题解才突然想起来:组合计 ...
- hdu 4609 3-idiots [fft 生成函数 计数]
hdu 4609 3-idiots 题意: 给出\(A_i\),问随机选择一个三元子集,选择的数字构成三角形的三边长的概率. 一开始一直想直接做.... 先生成函数求选两个的方案(注意要减去两次选择同 ...
- hdu 4609 3-idiots <FFT>
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 给定 N 个正整数, 表示 N 条线段的长度, 问任取 3 条, 可以构成三角形的概率为多 ...
- HDU 4609 3-idiots(FFT)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给出n个正整数(数组A).每次随机选出三个数.问这三个数能组成三角形的概率为多大? 思路: ...
- HDU 4609 FFT模板
http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给你n个数,问任意取三边能够,构成三角形的概率为多少. 思路:使用FFT对所有长度的个数进行卷积(\ ...
- hdu 4609 3-idiots——FFT
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609 答案就是随便选三条边的方案 - 不合法的方案. 不合法的方案就是算出 x+y = k 的方案数 g[ ...
- hdu 4609 3-idiots —— FFT
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609 算不合法的比较方便: 枚举最大的边,每种情况算了2次,而全排列算了6次,所以还要乘3: 注意枚举最大 ...
- FFT(快速傅里叶变换):HDU 4609 3-idiots
3-idiots Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
随机推荐
- hostapd源代码分析(一):网络接口和BSS的初始化
[转]hostapd源代码分析(一):网络接口和BSS的初始化 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004349 最近在做一 ...
- Android 代码混淆 防止反编译
为了防止代码被反编译,因此需要加入混淆.混淆也可以通过第三方进行apk混淆,也可以用android中的proguard进行混淆. 混淆步骤: 1.配置混淆文件,名字可以随意,在这里使用proguard ...
- hdu 4521 小明系列问题——小明序列(线段树 or DP)
题目链接:hdu 4521 本是 dp 的变形,却能用线段树,感觉好强大. 由于 n 有 10^5,用普通的 dp,算法时间复杂度为 O(n2),肯定会超时.所以用线段树进行优化.线段树维护的是区间内 ...
- 关于时区的时间的详解,比如UTC\GMT等
UTC 和 GMT 及 北京时间的关系 UTC和GMT,这两者几乎是同一概念.它们都是指的格林尼治标准时间,只不过UTC的称呼更为正式一点.两者的区别在于前者是一个天文 上的概念,而 后者是基于一个原 ...
- D3.js 交互式操作
与图表的交互,指在图形元素上设置一个或多个监听器,当事件发生时,做出相应的反应. 一.什么是交互 交互,指的是用户输入了某种指令,程序接受到指令之后必须做出某种响应.对可视化图表来说,交互能使图表更加 ...
- jackson反序列化时忽略不需要的字段(zhuan)
http://www.cnblogs.com/davidwang456/p/5434071.html ********************************************* 有时候 ...
- 在XP下把win7安装到VHD,内存足够大可以RAMOS
在XP下把win7安装到VHD,内存足够大可以RAMOS1.用DiskGenius创建VHD固定大小磁盘文件,以win7vhd.vhd为例,然后进行分区格式化,格式化时启用NTFS压缩.2.进入WIN ...
- Selenium解决页面元素不在视野范围内的问题
当需要使用滚动条才能使页面元素显示在视野范围内时,必须用代码处理下,才能对其进行操作. 处理其实也很简单,就是调用JS函数. driver.executeScript("arguments[ ...
- SSH2 架构常用注解
1. @Repository 将 DAO 类声明为 Bean 2.@Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次. 3.@Service 通常作用在业务层 ...
- linux gcc 编译动态类库(.so)和静态类库(.a)
linux gcc 编译动态类库(.so)和静态类库(.a) 我的编译环境 ubuntu desktop 16.04 一:测试代码 测试有3个文件:AB.h,AB.c,test.c //AB.h vo ...