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时间优于 ...
随机推荐
- Time倒计时
commitTimeDate = new Date("2016/11/9 10:02:40").getTime() + 24*60*60*1000;//截止时间 myDate = ...
- 利用DataSet部分功能实现网站登录
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- C# 请求Web Api 接口,返回的json数据直接反序列化为实体类
须要的引用的dll类: Newtonsoft.Json.dll.System.Net.Http.dll.System.Net.Http.Formatting.dll Web Api接口为GET形式: ...
- 26最小公倍数 lowest common multiple
题目描述 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数. 输入描述:输入两个正整数A和B. 输出描述:输出A和B的最小公倍数. 输入例子 ...
- Codeforces 223C Partial Sums 数论+组合数学
题意非常easy,求不是那么好求的,k非常大 要操作非常多次,所以不可能直接来的.印象中解决操作比較多无非线段树 循环节 矩阵 组合数等等吧,这道题目 也就仅仅能多画画什么 的了 就以第一个案例为主吧 ...
- SQL Server外连接、内连接、交叉连接
小编在做组织部维护最后收尾工作的时候,遇到了这样一个问题,须要将定性考核得分查出来.定量考核相应的数据查出来并进行得分计算.附加分查出来,最后将这三部分信息汇总之后得到总成绩,假设当中一项成绩没有进行 ...
- uboot生成随机的MAC地址
转载:http://blog.chinaunix.net/uid-25885064-id-3303132.html 在使用U-boot时,有个问题就是MAC地址的设置,如果MAC地址相同的两块开发板在 ...
- HTML5实现两个视频循环播放!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- linux jdk 安装另一种方法
linux 7.2 安装 jdk方法: (1). 以root用户登录linux系统, 应用Xmanager把文件拷贝到linux 系统的根目录. (2). 进入opt/software建立jvm文件夹 ...
- 10个迷惑新手的Cocoa&Objective-c开发问题
本文转载至 http://blog.csdn.net/lvxiangan/article/details/27964733 language background runtime thre ...