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的更多相关文章

  1. 解题:HDU 4609 Three Idiots

    题面 要求组合的方法显然我们需要对桶卷积,即设$F(x)=\sum\limits_{i=1}^{maxx}x^{cnt[i]}$,然后我们初步的先把$F^2(x)$卷出来,表示选两条边.然后我们发现如 ...

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

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

  3. hdu 4609 3-idiots [fft 生成函数 计数]

    hdu 4609 3-idiots 题意: 给出\(A_i\),问随机选择一个三元子集,选择的数字构成三角形的三边长的概率. 一开始一直想直接做.... 先生成函数求选两个的方案(注意要减去两次选择同 ...

  4. hdu 4609 3-idiots <FFT>

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 给定 N 个正整数, 表示 N 条线段的长度, 问任取 3 条, 可以构成三角形的概率为多 ...

  5. HDU 4609 3-idiots(FFT)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给出n个正整数(数组A).每次随机选出三个数.问这三个数能组成三角形的概率为多大? 思路: ...

  6. HDU 4609 FFT模板

    http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给你n个数,问任意取三边能够,构成三角形的概率为多少. 思路:使用FFT对所有长度的个数进行卷积(\ ...

  7. hdu 4609 3-idiots——FFT

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609 答案就是随便选三条边的方案 - 不合法的方案. 不合法的方案就是算出 x+y = k 的方案数 g[ ...

  8. hdu 4609 3-idiots —— FFT

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609 算不合法的比较方便: 枚举最大的边,每种情况算了2次,而全排列算了6次,所以还要乘3: 注意枚举最大 ...

  9. FFT(快速傅里叶变换):HDU 4609 3-idiots

    3-idiots Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

随机推荐

  1. POJ2676,HDU4069解决数独的两种实现:DFS、DLX

    搜索实现:解决数独有两种思考策略,一种是枚举当前格能填的数字的种数,这里有一优化策略就是先搜索能填入种数小的格子:另一种是考虑处理某一行(列.宫)时,对于某一个没用过的数字,若该行(列.宫)只有一个可 ...

  2. poj2079Triangle(N点中三点组成三角形面积最大)

    链接 根据旋转卡壳的思想,找到当前边的最远点. 确定i,j找到最远的k使 cross(i,j,k)最大,那么i,j+1时只需从k+1开始找即可 . #include <iostream> ...

  3. WPA/WPA2四次握手

    WPA/WPA2四次握手 官方文档:https://en.wikipedia.org/wiki/IEEE_802.11i-2004 The four-way handshake is designed ...

  4. 关于图片加载非常爽的一个三方控件 fresco,一个三fresco

    Hi  EveryBody 今天来玩一个非常爽的控件 fresco 到底有多爽呢 接着看就知道了 首先 来看看fresco 是个神马东西 https://github.com/facebook/fre ...

  5. 自定义MVC Html

    自定义ASP.NET MVC Html辅助方法 在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明.有时候,我们不想重复地写一些HTML代码,或者MS没有提供我 ...

  6. hiho_1079_离散化

    题目 在长度为L的宣传栏上张贴N张海报,将宣传栏分为L个长度为1的单位,海报长度为整数,且高度和宣传栏相同,左右边界和宣传栏单位之间缝隙重合(即海报总是跨越整数个单位).后贴的海报可能会覆盖之前贴的海 ...

  7. js倒计时 网上流传最多的

    <!DOCTYPE html><html><head><script src="http://libs.baidu.com/jquery/1.10. ...

  8. python自定义函数大全

    写的零碎的python脚本太多了,到一定阶段就会出现一个问题,即以前写过的脚本找不到了,现在临时要用,还得再重写一遍,这就非常难受了,代码不能复用. 还好我有一个比较好的习惯,我喜欢把python脚本 ...

  9. eclipse 新建 maven 项目 添加 spring hibernate 的配置文件 详情

    主要配置文件 pom.xml 项目的maven 配置文件 管理项目所需 jar 依赖支持 web.xml 项目的总 配置文件  :添加 spring和hibernate 支持 applicationC ...

  10. Java位操作全面总结

    转载: Java位操作全面总结 在计算机中所有数据都是以二进制的形式储存的.位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快.在实际编程中,如果能巧妙运用位操作,完全可以达到 ...