hdu4609 3-idiots

FFT

代码

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<complex>
using namespace std;
const int N = ;
const double PI = acos(-1.0);
typedef complex<double> Comp;
Comp a[N],b[N];
int len,l,n,i,v,c[N];
long long ans[N];
double Ans,nn;
void Rader(Comp *F,int len)
{
int j = len >> ;
for (int i=;i<len-;i++)
{
if (i<j) swap(F[i],F[j]);
int k = len>>;
while (j >= k)
{
j -= k;
k >>= ;
}
if (j < k) j += k;
}
}
void FFT(Comp *F,int len,int on)
{
Rader(F,len);
for (int h=;h<=len;h<<=)
{
Comp wn(cos(-on**PI/h),sin(-on**PI/h));
for (int j=;j<len;j+=h)
{
Comp w(,);
for (int k=j;k<j+h/;k++)
{
Comp u = F[k];
Comp t = w*F[k + h / ];
F[k] = u + t;
F[k + h / ] = u - t;
w = w * wn;
}
}
}
if (on == -)
for (int i=;i<len;i++)
F[i]/=len;
}
void Conv(Comp *a,Comp *b,int len)
{
FFT(a,len,);
FFT(b,len,);
for (int i=;i<len;i++)
a[i] =a[i]*b[i];
FFT(a,len,-);
for (int i=;i<len;i++)
ans[i]=a[i].real()+0.5;
}
int main()
{
int test;
scanf("%d",&test);
while (test)
{
test--;
scanf("%d",&n);
l=;
memset(a,,sizeof(a));
memset(b,,sizeof(b));
for (i=;i<=n;i++)
{
scanf("%d",&v);
c[i]=v;
int q=a[v].real()+;
a[v].real(q);
b[v].real(q);
l=max(l,v);
}
len=;
while (len<=l*) len*=;
Conv(a,b,len);
for (i=;i<=n;i++)
ans[c[i]+c[i]]--;
for (i=;i<len;i++)
ans[i]/=;
for (i=;i<len;i++)
ans[i]=ans[i-]+ans[i];
sort(c+,c++n);
nn=n;
Ans=;
for (i=;i<=n;i++)
Ans+=(ans[len-]-ans[c[i]]-(nn-)-(nn-i)*(i-)-(nn-i)*(nn-i-)/);
printf("%.7lf\n",Ans/(nn*(nn-)*(nn-)/));
}
}
上一篇:基于Eclipse搭建STM32开源开发环境


下一篇:spring中bean的设计模式