题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609

答案就是随便选三条边的方案 - 不合法的方案。

不合法的方案就是算出 x+y = k 的方案数 g[ k ],对于每个长度 z ,不合法方案+=\( \sum\limits_{k=0}^{z}g[k] \)

注意 FFT 之后偶数项 k 算上了取长度为 k/2 的同一条边两遍的方案,要去重。

随便选三条边的 n*(n-1)*(n-2) 会把同一个 x , y , z 算6遍,而枚举 z 会把同一个 x , y , z 算两遍,所以要乘3。

注意减去的时候乘上长度为 z 的边的个数。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
#define ll long long
using namespace std;
const int N=1e5+,M=(<<)+;
const db pi=acos(-);
int T,n,len,r[M],f[N];
struct cpl{db x,y;}a[M],I;
cpl operator+ (cpl a,cpl b){return (cpl){a.x+b.x,a.y+b.y};}
cpl operator- (cpl a,cpl b){return (cpl){a.x-b.x,a.y-b.y};}
cpl operator* (cpl a,cpl b){return (cpl){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
int Mx(int a,int b){return a>b?a:b;}
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
void fft(cpl *a,bool fx)
{
for(int i=;i<len;i++)
if(i<r[i])swap(a[i],a[r[i]]);
for(int R=;R<=len;R<<=)
{
int m=R>>;
cpl wn=(cpl){ cos(pi/m),fx?-sin(pi/m):sin(pi/m) };
for(int i=;i<len;i+=R)
{
cpl w=I;
for(int j=;j<m;j++,w=w*wn)
{
cpl x=a[i+j],y=w*a[i+m+j];
a[i+j]=x+y; a[i+m+j]=x-y;
}
}
}
if(!fx)return;
for(int i=;i<len;i++)a[i].x/=len;
}
int main()
{
T=rdn();int mx=; I.x=;
while(T--)
{
n=rdn();
for(int i=;i<len;i++)a[i].x=a[i].y=;
for(int i=;i<=mx;i++)f[i]=;
for(int i=,u;i<=n;i++)
{
u=rdn();mx=Mx(mx,u);
a[u].x+=; f[u]++;
}
for(len=;len<=mx<<;len<<=);//mx
for(int i=,j=len>>;i<len;i++)r[i]=(r[i>>]>>)+((i&)?j:);
fft(a,);
for(int i=;i<len;i++)a[i]=a[i]*a[i];
fft(a,);
ll sm=(ll)n*(n-)*(n-),ans=sm,lj=;
for(int i=;i<=mx;i++)
{
lj+=( (ll)(a[i].x+0.5)-((i&)==?f[i>>]:) )*;
ans-=lj*f[i];//*f[i]!!
}
printf("%.7f\n",(db)ans/sm);
}
return ;
}

最新文章

  1. ngrok内网穿透利器在windws下的使用
  2. iOS开发——UI进阶篇(十五)Quartz2D介绍
  3. HTML静态网页 标签、表格
  4. JAVA的网络编程基础概念
  5. 滑动菜单栏(一)开源项目SlidingMenu的使用
  6. Least_squares 最小二乘法
  7. 从头开始学JavaScript (九)——执行环境和作用域
  8. windows server 2012 + sql server 2008 r2安装
  9. Java 求n天前的时间或者n月前的时间
  10. 【Qt编程】3D迷宫游戏
  11. Python学习笔记二
  12. Java基础第一天(标识符、变量)
  13. Spring中的CharacterEncodingFilter
  14. 设计模式:Builder
  15. vue+iview实现一行平均五列布局
  16. python高级特性和高阶函数
  17. 20165310_Exp2实验三《敏捷开发与XP实践》
  18. PGSql
  19. bzoj4241: 历史研究(回滚莫队)
  20. 不使用sudo命令执行docker

热门文章

  1. AtCoder Regular Contest 096
  2. Spring -- spring整合struts2
  3. ExtJS Ext.Ajax.request最好设为同步
  4. log4j.appender.AFile.File日志的相对路径
  5. 智课雅思词汇---二十四、名词性后缀ary(也是形容词后缀)
  6. django1.9的static文件配置
  7. GO学习笔记:struct类型
  8. 51nod-1201-数位dp
  9. 神经网络训练时出现nan错误
  10. Project Euler 126 - Cuboid layers