bzoj3513
给定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);
}
}
bzoj3513的更多相关文章
- [bzoj3513][MUTC2013]idiots_FFT
idiots bzoj-3513 MUTC-2013 题目大意:给定$n$根木棍,问随机选择三根能构成三角形的概率. 注释:$1\le n\le 3\cdot 10^5$,$1\le a_i\le 1 ...
- BZOJ3513: [MUTC2013]idiots
Description 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. Input 第一行T(T<=100),表示数据组数.接下来若干行描述T组数据,每组数据第一行是n ...
- BZOJ3513[MUTC2013]idiots——FFT+生成函数
题目描述 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. 输入 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个 ...
- bzoj千题计划168:bzoj3513: [MUTC2013]idiots
http://www.lydsy.com/JudgeOnline/problem.php?id=3513 组成三角形的条件:a+b>c 其中,a<c,b<c 若已知 两条线段之和=i ...
- 2019.01.02 bzoj3513: [MUTC2013]idiots(fft)
传送门 fftfftfft经典题. 题意简述:给定nnn个长度分别为aia_iai的木棒,问随机选择3个木棒能够拼成三角形的概率. 思路:考虑对于木棒构造出生成函数然后可以fftfftfft出两个木 ...
- [MUTC2013][bzoj3513] idiots [FFT]
题面 传送门 思路 首先有一个容斥原理的结论:可以组成三角形的三元组数量=所有三元组-不能组成三角形的三元组 也就是说我们只要求出所有不能组成三角形的三元组即可 我们考虑三元组(a,b,c),a< ...
- 【bzoj3513】[MUTC2013]idiots FFT
题目描述 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. 输入 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个 ...
- 多项式相关&&生成函数相关&&一些题目(updating...)
文章目录 多项式的运算 多项式的加减法,数乘 多项式乘法 多项式求逆 多项式求导 多项式积分 多项式取对 多项式取exp 多项式开方 多项式的除法/取模 分治FFT 生成函数 相关题目 多项式的运算 ...
- 各种注意事项(还有c++的一些操作)
转c++时间: 2017年8月9号 1.记得打头文件 2.=与==的区别(赋值|比较) 3.各种运算符的比较级(与Pascal不同),主要是==与位运算 *4.在OJ上scanf和printf时间优于 ...
随机推荐
- 【BLE】CC2541之自己定义按键
本篇博文最后改动时间:2017年01月06日,11:06. 一.简单介绍 本文以SimpleBLEPeripheral为例.介绍怎样将普通IO口(P12)自己定义为按键. 注:本文加入按键方法不与协议 ...
- 使用Chrome(PC)调试移动设备上的网页
最早开始调试移动端网页时,本人都是采取PC上改几行代码,手机上刷新一下看效果这种笨方法来开发的,效率低而且容易让人抓狂.最近偶然发现原来可以使用PC上的浏览器来调试移动设备,不由得感叹相逢恨晚. 工具 ...
- Asp.Net北大青鸟总结(四)-使用GridView实现真假分页
这段时间看完了asp.net视频.可是感觉到自己的学习好像没有巩固好,于是又在图书馆里借了几本关于asp.net的书感觉真的非常好自己大概对于asp.net可以实现主要的小Demo.可是我知道仅仅有真 ...
- Project Euler:Problem 41 Pandigital prime
We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly o ...
- struts2 环境建立(1)
说明:以下操作都是以本机例 在java web 开发之前,应该具备开发环境.要搭建开发环境应该具备以下工作: 1 JDK,jdk是java开发不可缺少的开发工具包. 2. 开发工具本例使用Eclips ...
- python 基础 1.5 python数据类型(四)--字典
一.python 数据类型--字典 1.用字符串存储信息,如:存储“姓名,身高,性别”: In [1]: info='Tom 170 M' //字符串存储信息 In [3]: info[0:3] // ...
- WCP源码分析 与SpringMVC学习资料
1.在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便. Spring2.5为我们引入了组件自动扫描机制,他可以在 ...
- HUD3689 Infinite monkey theorem
Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- wepy项目中使用async await
https://github.com/Tencent/wepy/wiki/wepy项目中使用async-await
- 2017-2018-1 20179209《Linux内核原理与分析》第五周作业
一.实验:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 环境说明 实验环境为 Ubuntu16.10 和 实验楼环境. 选择39号系统调用实验.39号系统调用为mkdir系统调用. ...