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 ...
随机推荐
- 安装Java EE失败,解决方案
笔者安装Java EE(版本是java_ee_sdk-7-jdk7-windows-x64-ml.exe)时,遇到错误提示提示"Could not find the required ver ...
- C语言 猜数游戏--产生一个随机数
#include <stdio.h> #include <time.h> #include <stdlib.h> int main(int argc, const ...
- html关于强制显示 隐藏浏览器的滚动条
浏览器的滚动条在一些特殊的展示中,是不需要的,所以必须把它隐藏掉,文章主要介绍一些隐藏或者显示IE的水平或者垂直滚动条的实现代码,需要了解的朋友可以参考下: 相关css代码如下: //强制显示滚动条: ...
- JS获取图片实际宽高及根据图片大小进行自适应
JS获取图片实际宽高,以及根据图片大小进行自适应 <img src="http://xxx.jpg" id="imgs" onload="ad ...
- (转)android底部弹出iOS7风格对话选项框(QQ对话框)--第三方开源--IOS_Dialog_Library
本文转载于:http://blog.csdn.net/zhangphil/article/details/44940339 完成这个效果的是使用了 IOS_Dialog_Library 下载地址:ht ...
- TextView文字排版问题:
本文转载自:http://blog.sina.com.cn/s/blog_821e2bb101011803.html textview自动换行导致混乱的原因----半角字符与全角字符混乱所致!一般情况 ...
- wxPython + Boa 练习程序
最近需要做点支持linux的跨平台gui,网上查到了wxPython及Boa,感觉不错,照着Boa文档做做练习. 代码: App: #!/usr/bin/env python #Boa:App:Boa ...
- Python LOGGING使用方法
Python LOGGING使用方法 1. 简介 使用场景 场景 适合使用的方法 在终端输出程序或脚本的使用方法 print 报告一个事件的发生(例如状态的修改) logging.info()或log ...
- 1095. Cars on Campus (30)
Zhejiang University has 6 campuses and a lot of gates. From each gate we can collect the in/out time ...
- Sybase ASE报错:server Error: 8242, Severity: 16, State: 1
昨天上午,同事反映某系统在执行存储过程的过程中报错了,报错的信息异常如下: 05:00000:00009:2014/06/09 15:45:30.34 server Error: 8242, Seve ...