2013 Multi-University Training Contest 1 3-idiots
解题报告:
记录 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的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- JSU 2013 Summer Individual Ranking Contest - 5
JSU 2013 Summer Individual Ranking Contest - 5 密码:本套题选题权归JSU所有,需要密码请联系(http://blog.csdn.net/yew1eb). ...
- 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 ...
- 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 ...
- 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 ...
- 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) ...
- 2016 Multi-University Training Contest 2 D. Differencia
Differencia Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
随机推荐
- 生成HTMLTestRunner测试报告的操作步骤——Python+selenium自动化
HTMLTestRunner是Python标准库的unittest模块的一个扩展,具体操作如下 1.安装 环境:Window8 步骤:1)http://tungwaiyip.info/software ...
- JDK 与 JRE (转)
很多程序员已经干了一段时间java了依然不明白jdk与jre的区别.JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境. ...
- 【linux】学习笔记
2014.06.07 开机无法上网,每次都得 $ sudo ifconfig eth1 up $ sudo dhclient eth1 后面发现原来是网卡没设置开机启动 编辑/etc/sysconfi ...
- extjs的combobox的用法
可以用javascript的数组作为数据源,也可以用json作为数据源: 1.用javascript数组 var CountryCode = [ ['93','Afghanistan(93)'], [ ...
- 每日一“酷”之array
array--国定类型数据序列 array模块定义一个序列数据结构,看起来和list非常相似,只不过所有成员都必须是相同的基本类型. 1.初始化 array实例化时可以提高一个参数来描述允许哪个种数据 ...
- nginx服务器绑定域名和设置根目录
首先进入nginx安装目录的配置目录conf,然后执行 vi conf/nginx.conf 打开nginx的配置文件,找到并修改红字部分 server { listen default_server ...
- 转学步园:jquery offset
JQuery Offset实验与应用 我们有时候需要实现这样一种功能:点击一个按钮,然后在按钮的下方显示一个div.当按钮位于角落时,div的位置设定就需要计算,使div完全显示. 我打算使用offs ...
- MySQL参数调优最佳实践
前言很多时候,RDS用户经常会问如何调优RDS MySQL的参数,为了回答这个问题,写一篇blog来进行解释: 哪一些参数不能修改,那一些参数可以修改:这些提供修改的参数是不是已经是最佳设置,如何才能 ...
- 【C#】索引器
索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 ...
- 2016 系统设计第一期 (档案一)jQuery checkbox 取值赋值
<div class="form-group"> <label for="IsActive" class="col-sm-2 con ...