解题报告:

记录 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. HttpWebResponse取不到Cookie?原来是因为被跳转了

    今天做模拟登陆的时候,发现HttpWebResponse的Cookie都为空,但是Fiddler看是有的...后来看见是302状态,才知道请求这个的时候,Response回来已经是跳转了...这样Co ...

  2. Linux C 程序 进程间通信(20)

    进程间通信 1.进程间通信的几种手段:    (1).管道        数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道),如果要建立全双工通信,需要建立两个管道        只能用于 ...

  3. sql中更新数据库用到declare @a in

    declare @a in update TB_Class set @a=1,name='李小龙' where ID=1 这样就可以像更新哪个就更新哪个了 例如ibatisnet中需要更新的时候: & ...

  4. [jQuery]我的封装笔记

    jQuery封装插件开发入门教程: http://www.awaimai.com/467.html 一.默认值和选项 jQuery.extend函数解释 extend(dest,src1,src2,s ...

  5. Ubuntu14.04忘记root密码的解决方法

    电脑20多天没用忘记密码了,下面是在网上找到的一个解决办法,其它的和这个也大概相同.因为其中有些缺漏,没能给我解决问题.通过分析最终问题还是解决了,现解决方案的关键点记录一下.希望能方便到其它人. 1 ...

  6. Python数据结构——栈、队列的实现(二)

    1. 一个列表实现两个栈 class Twostacks(object): def __init__(self): self.stack=[] self.a_size=0 self.b_size=0 ...

  7. SQL左连接、右连接和内连接的简单示例

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录: right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录: inner join(等值连接 ...

  8. with check option(视图 )

    建立视图的时候使用WITH CHECK OPTION 与不使用的区别 WITH CHECK OPTION insert update  delete 使用with check option 保证ins ...

  9. Error NO.2013 Lost connection to Mysql server during query

    系统:[root@hank-yoon ~]# cat /etc/redhat-release CentOS release 6.3 (Final) DB版本:mysql> select @@ve ...

  10. 【采集】php str_replace

    <?php function my_str_replace($xmlHttp,$order='asc'){ if($order=='asc'){ return str_replace(array ...