解题报告:

记录 A_i 为长度为 i 的树枝的数量,并让 A 对它本身做 FFT,得到任意选两个树枝能得到的各个和的数量。枚举第三边,

计算出所有两边之和大于第三条边的方案数,并把前两条边包含最长边的情况减掉就是答案。

 

 #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define pi acos(-1.0)
using namespace std;
const int MAX = ;
//复数结构体
struct complex{
double r,i;
complex(double R=,double I=){
r=R;i=I;
}
complex operator+(const complex &a){
return complex(r+a.r,i+a.i);
}
complex operator-(const complex &a){
return complex(r-a.r,i-a.i);
}
complex operator*(const complex &a){
return complex(r*a.r-i*a.i,r*a.i+i*a.r);
}
};
/*
*进行FFT和IFFT前的反转变换
*位置i和i的二进制反转后位置互换,(如001反转后就是100)
*len必须去2的幂
*/
void change(complex x[],int len){
int i,j,k;
for(i = , j = len>>; i <len-; i++){
if (i < j) swap(x[i],x[j]);
//交换互为小标反转的元素,i<j保证交换一次
//i做正常的+1,j做反转类型的+1,始终i和j是反转的
k = len>>;
while (j >= k){
j -= k;
k >>= ;
}
if (j < k) j += k;
}
}
/*
*做FFT O(nLogn)
*len必须为2^n形式,不足则补0
*on=1时是DFT,on=-1时是IDFT
*/
void fft (complex x[],int len,int on){
change(x,len); //调用反转置换
for (int i=;i<=len;i<<=){//控制层次
//初始化单位复根
complex wn(cos(on**pi/i),sin(on**pi/i));
for (int j=;j<len;j+=i){
complex w(,); //初始化旋转因子
for (int k=j;k<j+i/;k++){
complex u = x[k];
complex t = w*x[k+i/];
x[k] = u+t;
x[k+i/] = u-t;
w = w*wn; //更新旋转因子
}
}
}
if (on == -){
for (int i=;i<len;i++){
x[i].r /= len;
}
}
}
complex x1[MAX];
int a[MAX/];
ll num[MAX],sum[MAX];
int main()
{
int i,j,k,len1,len2,len,t,n;
cin>>t;
while(t--){
cin>>n;
memset(num,,sizeof(num));
for (i=;i<n;i++){
cin>>a[i];
num[a[i]]++;
}
sort(a,a+n);
len1 = a[n-]+;
len = ;
while (len<*len1) len<<=;
for (i=;i<len1;i++){
x1[i] = complex(num[i],);
}
for (i=len1;i<len;i++){
x1[i] = complex(,);
}
fft(x1,len,);
for (i=;i<len;i++){
x1[i] = x1[i]*x1[i];
}
fft(x1,len,-);
for (i=;i<len;i++){
num[i] = (ll)(x1[i].r+0.5);
}
len = *a[n-];
for (i=;i<n;i++)
num[a[i]+a[i]]--;//减去自己与自己的组合
for (i=;i<=len;i++)
num[i] /= ;//考虑a+b,b+a的组合,个数/2
sum[] = ;
for (i=;i<=len;i++){
sum[i] = sum[i-]+num[i];//求前项和
}
ll cnt = ;
for (i=;i<n;i++){
cnt += sum[a[i]];//a+b<=c的个数
}
ll total = (ll)n*(n-)*(n-)/;
printf("%.7lf\n",-(double)cnt/total);
}
return ;
}

 

 

 

 

2013 Multi-University Training Contest 1 3-idiots的更多相关文章

  1. Integer Partition(hdu4658)2013 Multi-University Training Contest 6 整数拆分二

    Integer Partition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  2. Partition(hdu4651)2013 Multi-University Training Contest 5

    Partition Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków

    ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków Problem A: Rubik’s Rect ...

  4. Partition(hdu4651)2013 Multi-University Training Contest 5----(整数拆分一)

    Partition Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. JSU 2013 Summer Individual Ranking Contest - 5

    JSU 2013 Summer Individual Ranking Contest - 5 密码:本套题选题权归JSU所有,需要密码请联系(http://blog.csdn.net/yew1eb). ...

  6. HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/500 ...

  8. 2015 Multi-University Training Contest 8 hdu 5390 tree

    tree Time Limit: 8000ms Memory Limit: 262144KB This problem will be judged on HDU. Original ID: 5390 ...

  9. hdu 4946 2014 Multi-University Training Contest 8

    Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  10. 2016 Multi-University Training Contest 2 D. Differencia

    Differencia Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

随机推荐

  1. ☆RHEL6创建软raid的使用☆——经典之作

    raid主要的种类 1.raid0  扩展卷   raid 0又称Stripee或Striping,中文译为集带工作方式, 有时也可以理解为拼凑. 它是将要存取的数据以条带状的形式尽量平均分配到多个硬 ...

  2. jQuery ID与Class性能对比之一

    最近一直在做网站的优化方面的工作,在实际优化的过程中逐渐发现yahoo的34条只能作为一个大的方向,除此之外还有很多地方值得前端工程师关注的.结合最近的优化体会及实地测试,现发出来一部分供大家批评指正 ...

  3. asp.net mvc常用的数据注解和验证以及entity framework数据映射

    终于有时间整理一下asp.net mvc 和 entity framework 方面的素材了. 闲话少说,步入正题: 下面是model层的管理员信息表,也是大伙比较常用到的,看看下面的代码大伙应该不会 ...

  4. 基础学习总结(七)--子线程及Handler

    使用子线程获取网络图片1.采用httpUrlConnection直连方式获取图片2.采用子线程方式获取 <LinearLayout xmlns:android="http://sche ...

  5. CentOS 7 yum nginx MySQL PHP 简易环境搭建

    用centos自带的yum源来安装nginx,mysql和php,超级方便,省去编译的麻烦,省去自己配置的麻烦,还能节省非常多的时间. 我们先把yum源换成国内的阿里云镜像源(当然不换也可以),先备份 ...

  6. openerp经典收藏 深入理解工作流(Workflow)(转载)

    深入理解工作流(Workflow) 原文:http://shine-it.net/index.php/topic,2494.0.html 一.工作流定义:<?xml version=" ...

  7. 忘记linux root密码怎么办?

    摘自:<鸟哥的Linux私房菜> 常常有些朋友在配置好了Linux之后,结果root密码给他忘记去!要重新安装吗?不需要的, 你只要以单人维护模式登陆即可更改你的root密码喔!由于lil ...

  8. C# Winfrom小黄鸡功能调用

    最近研究微信公众平台,搭建了一个微信聊天机器人,调用小黄鸡的公众接口,实现在线和小黄鸡聊天的功能. 接口调用不是很麻烦,不过是php版本,所以研究了一下C#的功能模块, Winfrom版 后台界面代码 ...

  9. .Net码农学Android---前言

    自从毕业参加工作后,就一直想学移动领域得开发,但时间.精力.决心.学习成本等这些问题总在不同程度的阻碍着自己. 但这段时间自己想做一款属于自己的App的想法越来越强烈,我感到自己快压不住这股能量了.终 ...

  10. 在Web API中使用Swagger-UI开源组件(一个深坑的解决)

    介绍: Swagger-Ui是一个非常棒的Web API说明帮助页,具体详情可自行Google和百度. 官网:http://swagger.io/    GitHub地址:https://github ...