您的位置:首页 > 大数据 > 物联网

hdu4609 3-idiots

2015-08-12 22:10 253 查看
FFT

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<complex>
using namespace std;
const int N = 400005;
const double PI = acos(-1.0);
typedef complex<double> Comp;
Comp a
,b
;
int len,l,n,i,v,c
;
long long ans
;
double Ans,nn;
void Rader(Comp *F,int len)
{
int j = len >> 1;
for (int i=1;i<len-1;i++)
{
if (i<j) swap(F[i],F[j]);
int k = len>>1;
while (j >= k)
{
j -= k;
k >>= 1;
}
if (j < k) j += k;
}
}
void FFT(Comp *F,int len,int on)
{
Rader(F,len);
for (int h=2;h<=len;h<<=1)
{
Comp wn(cos(-on*2*PI/h),sin(-on*2*PI/h));
for (int j=0;j<len;j+=h)
{
Comp w(1,0);
for (int k=j;k<j+h/2;k++)
{
Comp u = F[k];
Comp t = w*F[k + h / 2];
F[k] = u + t;
F[k + h / 2] = u - t;
w = w * wn;
}
}
}
if (on == -1)
for (int i=0;i<len;i++)
F[i]/=len;
}
void Conv(Comp *a,Comp *b,int len)
{
FFT(a,len,1);
FFT(b,len,1);
for (int i=0;i<len;i++)
a[i] =a[i]*b[i];
FFT(a,len,-1);
for (int i=0;i<len;i++)
ans[i]=a[i].real()+0.5;
}
int main()
{
int test;
scanf("%d",&test);
while (test)
{
test--;
scanf("%d",&n);
l=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for (i=1;i<=n;i++)
{
scanf("%d",&v);
c[i]=v;
int q=a[v].real()+1;
a[v].real(q);
b[v].real(q);
l=max(l,v);
}
len=1;
while (len<=l*2) len*=2;
Conv(a,b,len);
for (i=1;i<=n;i++)
ans[c[i]+c[i]]--;
for (i=0;i<len;i++)
ans[i]/=2;
for (i=1;i<len;i++)
ans[i]=ans[i-1]+ans[i];
sort(c+1,c+1+n);
nn=n;
Ans=0;
for (i=1;i<=n;i++)
Ans+=(ans[len-1]-ans[c[i]]-(nn-1)-(nn-i)*(i-1)-(nn-i)*(nn-i-1)/2);
printf("%.7lf\n",Ans/(nn*(nn-1)*(nn-2)/6));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: