给定n个长度分别为$a_i$的木棒,问随机选择3个木棒能够拼成三角形的概率。

$a_i$和$n$都在$10^5$以内

对于每一个i,我们统计比i短的边有多少组合能组成长度<=i的

用1减去这个概率就是能拼成的概率

具体就是用sum[i]表示i出现的次数

sum[i]可以转化成如下卷积的样子

$$sum[i] = \sum_{j=1}^{i-1}sum[j] * sum[i - j - 1]$$

然后FFT

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = ;
const double pi = acos(-1.0);
struct Cint
{
double r,i;
Cint() {r = i = 0.00;}
Cint(double _r,double _i) : r(_r),i(_i){}
Cint operator + (const Cint &b)const{return Cint(r + b.r,i + b.i);}
Cint operator - (const Cint &b)const{return Cint(r - b.r,i - b.i);}
Cint operator * (const Cint &b)const{return Cint(r * b.r - i * b.i,i * b.r + r * b.i);}
}s[maxn];
int a[maxn],LEN,n;
LL sum[maxn],ans;
inline void FFT_init(Cint *a,int len)
{
for(int i = ,j = len >> ,k;i < len - ;i++)
{
if(i < j)swap(a[i],a[j]);k = len;
while(j >= (k>>=)) j -= k;
if(j <= k) j += k;
}
}
inline void FFT(Cint *a,int len,int f)
{
FFT_init(a,len);int l,i,j,k;Cint u,v;
for(l = ;l <= len;l <<= )
{
i = l >> ;
Cint w(cos(-f * * pi / l),sin(-f * * pi / l));
for(j = ;j ^ len;j += l)
{
Cint wn(1.0,0.0);
for(k = j;k ^ (i + j);k++)
{
u = a[k]; v = wn * a[i + k];
a[k] = u + v;a[k + i] = u - v;
wn = w * wn;
}
}
}
if(f == -)
for(i = ;i < len;i++)a[i] . r /= len;
} int main()
{
//freopen("ou.txt","r",stdin);
//freopen("x.txt","w",stdout);
int T;scanf("%d",&T);
while(T--)
{
scanf("%d",&n);int mx = ;ans = ;
for(int i=;i<=LEN + ;i++)s[i] = Cint(0.0,0.0);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
mx = max(mx,a[i]);
}
for(LEN = ;(LEN >> ) < mx;LEN <<= );
for(int i=;i<=n;i++)s[a[i]].r += 1.0;
FFT(s,LEN,);
for(int i=;i<LEN;i++)s[i] = s[i] * s[i];
FFT(s,LEN,-);
for(int i=;i<=n;i++)s[a[i] * ].r -= 1.0;
for(int i=;i<=LEN;i++)sum[i] = sum[i-] + floor(s[i].r + 0.5);
for(int i=;i<=n;i++)ans += sum[a[i]];
double pos = 3.0 * ans / n / (n - ) / (n - );
printf("%.7lf\n",1.0 - pos);
}
}

最新文章

  1. 如何在高并发分布式系统中生成全局唯一Id
  2. OWIN与Katana详解
  3. webgl动画小测试
  4. 基于Solr的空间搜索
  5. Flapper Bird的学习笔记(二)
  6. ubuntu eclipse 中安装 python + PyDev
  7. 学习笔记-Java编程思想
  8. hibernate用setResultTransformer转换
  9. Java反射-方法(Method)
  10. Win7 Object_Header之TypeIndex解析
  11. soapdenovo
  12. Oracle执行计划——all_rows和first_rows(n) 优化器模式
  13. Linux php/php-fpm 安装,配置
  14. 深入理解SpringCloud之引导程序应用上下文
  15. javascript之奇淫技巧
  16. jQuery基础教程
  17. Sql server日期函数用法
  18. pta7-20 畅通工程之局部最小花费问题(Kruskal算法)
  19. 20155307《网络对抗》PC平台逆向破解(二)
  20. 深入理解jQuery插件开发【转】

热门文章

  1. Cloudera Manager 和 CDH 4 终极安装
  2. 添加w3c验证图片到网站
  3. Linux QtCreator 设置mingw编译器生成windows程序
  4. 10-客户端防表单重复提交和服务器端session防表单重复提交
  5. 现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。
  6. K均值算法总结
  7. java文本输入输出小结
  8. String代码示例
  9. 广播、多播和IGMP的一点记录
  10. 【BZOJ4653】[Noi2016]区间 双指针法+线段树