博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu4906:3-idiots【FFT】
阅读量:5328 次
发布时间:2019-06-14

本文共 2077 字,大约阅读时间需要 6 分钟。

题意

给出n个正整数,求从中任选3个数(下标不重复),求以这三个数为长度的边能构成三角形的概率。

分析与解

可以用FFT求出两个数的和(注意去重),然后枚举最长边,利用前缀和寻找比他短的和,总和即为不能形成三角形的数量。用总数减去这个数就是构成三角形的数量。

#include 
using namespace std;int n, a[(1<<18)+5];int rev[(1<<18)+5];int lg(int n){ int i = 0; for (int j = 1; j < n; j <<= 1, i++); return i;}const double pi = 3.1415926536;typedef complex
Complex;Complex A[(1<<18)+5];void fft(Complex a[], int n, int flag){ int lgn = lg(n); rev[0] = 0; for (int i = 0; i < n; i++) rev[i] = (rev[i>>1]>>1)|((i&1)<<(lgn-1)); for (int i = 0; i < n; i++) A[rev[i]] = a[i]; Complex u, t; for (int k = 2; k <= n; k <<= 1) { Complex dw = Complex(cos(2*pi/k), sin(flag*2*pi/k)); for (int i = 0; i < n; i += k) { Complex w = 1; for (int j = 0; j < k>>1; j++) { t = w*A[i+j+(k>>1)], u = A[i+j]; A[i+j] = u+t, A[i+j+(k>>1)] = u-t; w *= dw; } } } if (flag == 1) for (int i = 0; i < n; i++) a[i] = A[i]; else for (int i = 0; i < n; i++) a[i] = A[i]/(double)n; }Complex d[(1<<18)+5];long long sum[(1<<18)+5];int main(){ int T; scanf("%d", &T); while (T--) { int mx = INT_MIN; scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]), d[a[i]] = Complex(d[a[i]].real()+1, 0), mx = max(mx, a[i]); int len = 1; for (; len <= mx*2; len <<= 1); fft(d, len, 1); for (int i = 0; i < len; i++) d[i] = d[i]*d[i]; fft(d, len, -1); for (int i = 1; i <= n; i++) d[a[i]+a[i]] = Complex(d[a[i]+a[i]].real()-1, 0); memset(sum, 0, sizeof sum); sum[0] = 0; d[0] = Complex(0, 0); for (int i = 1; i < len; i++) sum[i] = sum[i-1] + (int)(d[i].real()+0.001)/2, d[i] = Complex(0, 0); long long cnt = 0; for (int i = 1; i <= n; i++) cnt += sum[a[i]]; printf("%.7lf\n", (double)((long long)n*(n-1)*(n-2)/6-cnt)/((long long)n*(n-1)*(n-2)/6)); } return 0;}

转载于:https://www.cnblogs.com/ljt12138/p/6684339.html

你可能感兴趣的文章
Spring入门第六课
查看>>
程序员专用表情包_拿走不谢
查看>>
五年后的回答
查看>>
面向对象 之 类
查看>>
【MySQL】mysql中any,in,some,all的区别
查看>>
javascript事件委托和jQuery事件绑定on、off 和one以及on绑定多个事件(重要)
查看>>
MySQL 函数
查看>>
使用roboware创建工作空间
查看>>
【JAVA】java中CyclicBarrier的使用方法,实例解说
查看>>
通讯录.数据来自字典
查看>>
hdu 5083 Instruction (稍比较复杂的模拟题)
查看>>
mysql索引简单介绍
查看>>
cocos2d-x由Jni实现Java与C++打电话给对方
查看>>
【Github教程】史上最全github用法:github入门到精通
查看>>
MyEclipse下XFire开发Webservice实例
查看>>
C++运算符优先级 转
查看>>
python使用webdriver处理上传文件(使用AutoIt)
查看>>
套接口编程简介
查看>>
JAVA对话框事件
查看>>
Python实现矩阵所有元素之和及某一列之和和某一行之和??
查看>>