题目描述

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

输入

第一行T(T<=100),表示数据组数。
接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个数表示a_i。
3≤N≤10^5,1≤a_i≤10^5

输出

T行,每行一个整数,四舍五入保留7位小数。

样例输入

2
4
1 3 3 4
4
2 3 3 4

样例输出

0.5000000
1.0000000

提示

T<=20

N<=100000

首先开一个桶就可以得到长度分别为[1,100000]的木棒个数,只要将桶自己与自己卷积FFT一下就能得到两个木棒组成的任意长度的方案数(注意去重)。三个木棒不合法的情况当且仅当两个木棒之和小于等于第三个木棒,对桶求一个后缀和(或对方案数求一个前缀和)即可。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<bitset>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const double pi=acos(-1.0);
int n,T,x;
ll t[400010];
struct miku
{
double x,y;
miku(double X=0,double Y=0){x=X,y=Y;}
}f[400010];
miku operator + (miku a,miku b){return miku(a.x+b.x,a.y+b.y);}
miku operator - (miku a,miku b){return miku(a.x-b.x,a.y-b.y);}
miku operator * (miku a,miku b){return miku(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
int l,r[400010];
int a[100010];
int mask;
inline void DFT(miku *A)
{
for(int i=0;i<mask;i++)
{
if(i<r[i])
{
swap(A[i],A[r[i]]);
}
}
for(int mid=1;mid<mask;mid<<=1)
{
miku id(cos(pi/mid),sin(pi/mid));
for(int i=mid<<1,j=0;j<mask;j+=i)
{
miku w(1,0);
for(int k=0;k<mid;k++,w=w*id)
{
miku x=A[j+k],y=w*A[j+k+mid];
A[j+k]=x+y;
A[j+k+mid]=x-y;
}
}
}
}
inline void IDFT(miku *A)
{
for(int i=0;i<mask;i++)
{
if(i<r[i])
{
swap(A[i],A[r[i]]);
}
}
for(int mid=1;mid<mask;mid<<=1)
{
miku id(cos(pi/mid),-1.0*sin(pi/mid));
for(int i=mid<<1,j=0;j<mask;j+=i)
{
miku w(1,0);
for(int k=0;k<mid;k++,w=w*id)
{
miku x=A[j+k],y=w*A[j+k+mid];
A[j+k]=x+y;
A[j+k+mid]=x-y;
}
}
}
}
int main()
{
scanf("%d",&T);
mask=1;
l=0;
while(mask<=200000)
{
mask<<=1;
l++;
}
for(int i=0;i<mask;i++)
{
r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
}
while(T--)
{
scanf("%d",&n);
memset(t,0,sizeof(t));
int mx=0;
for(int i=0;i<mask;i++)
{
f[i]=0;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
a[i]=x;
f[x].x++;
mx=max(mx,x);
}
DFT(f);
for(int i=0;i<mask;i++)
{
f[i]=f[i]*f[i];
}
IDFT(f);
for(int i=0;i<mask;i++)
{
f[i].x/=mask;
}
for(int i=1;i<=n;i++)
{
f[a[i]<<1].x--;
}
for(int i=1;i<=mx;i++)
{
t[i]=t[i-1]+(ll)(f[i].x/2+0.1);
}
ll ans=0;
for(int i=1;i<=n;i++)
{
ans+=t[a[i]];
}
printf("%.7f\n",1-(1.0*ans/(1.0*n*(n-1)/2*(n-2)/3)));
}
}

BZOJ3513[MUTC2013]idiots——FFT+生成函数的更多相关文章

  1. bzoj 3513 [MUTC2013]idiots FFT 生成函数

    [MUTC2013]idiots Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 806  Solved: 265[Submit][Status][Di ...

  2. bzoj 3513: [MUTC2013]idiots FFT

    bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...

  3. bzoj千题计划168:bzoj3513: [MUTC2013]idiots

    http://www.lydsy.com/JudgeOnline/problem.php?id=3513 组成三角形的条件:a+b>c 其中,a<c,b<c 若已知 两条线段之和=i ...

  4. 2019.01.02 bzoj3513: [MUTC2013]idiots(fft)

    传送门 fftfftfft经典题. 题意简述:给定nnn个长度分别为aia_iai​的木棒,问随机选择3个木棒能够拼成三角形的概率. 思路:考虑对于木棒构造出生成函数然后可以fftfftfft出两个木 ...

  5. bzoj 3513: [MUTC2013]idiots【生成函数+FFT】

    想了好长时间最后发现真是石乐志 第一反应就是两边之和大于第三边,但是这个东西必须要满足三次-- 任意的两边之和合通过生成函数套路+FFT求出来(记得去掉重复选取的),然后这任意两边之和大于任意第三边可 ...

  6. 【bzoj3513】[MUTC2013]idiots FFT

    题目描述 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. 输入 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个 ...

  7. BZOJ3513: [MUTC2013]idiots

    Description 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. Input 第一行T(T<=100),表示数据组数.接下来若干行描述T组数据,每组数据第一行是n ...

  8. [bzoj3513][MUTC2013]idiots_FFT

    idiots bzoj-3513 MUTC-2013 题目大意:给定$n$根木棍,问随机选择三根能构成三角形的概率. 注释:$1\le n\le 3\cdot 10^5$,$1\le a_i\le 1 ...

  9. BZOJ 3513: [MUTC2013]idiots

    3513: [MUTC2013]idiots Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 476  Solved: 162[Submit][Stat ...

随机推荐

  1. 面试 12:玩转 Java 快速排序

    终于轮到我们排序算法中的王牌登场了. 快速排序由于排序效率在同为 O(nlogn) 的几种排序方法中效率最高,因此经常被采用.再加上快速排序思想——分治法也确实非常实用,所以 在各大厂的面试习题中,快 ...

  2. NO NEWS IS GOOD NEWS

    从客户那传来一个噩耗:要求每个表单在保存之后,要在页面上弹一个 “ 保存成功 ” 的对话框. 客户代表志得意满地说这样用户体验更好,略带谴责意味地傲娇道,“你们早该想到的”.呵呵…… 可不是嘛,我刚入 ...

  3. Python股票分析系列——自动获取标普500股票列表.p5

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第5部分.在本教程和接下来的几节中,我们将着手研究如何为更多公司提供大量的定价信息,以及如何一次 ...

  4. Jmeter实例(一)_Beanshell脚本断言Mock接口

    我们在做接口断言的时候,如果遇到复杂的json,可以考虑用beanshell脚本去解析list,同时加入自定义的断言 Mock例:https://www.easy-mock.com/mock/5cb4 ...

  5. 简单的将Excel数据同步到SqlServer数据库中

    1.创建一个WinForm程序,添加一个Button控件 2.Button事件 private void button1_Click(object sender, EventArgs e) { Sys ...

  6. Makes And The Product CodeForces - 817B (思维+构造)

    B. Makes And The Product time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  7. 使用 Drools 和 JPA & Drools show case in docker hub

    使用 Drools 和 JPA 实现持续的实时数据分析https://www.ibm.com/developerworks/cn/java/j-drools5/index.html Drools - ...

  8. 架构 规则引擎 quartz

    通向架构师的道路(第五天)之tomcat集群-群猫乱舞-云栖社区-阿里云https://yq.aliyun.com/articles/259343 商业规则引擎和开源规则引擎的测试对比 - qq_39 ...

  9. 分布式Tomcat session会话Sticky Sessions问题

    分布式session会话Sticky Sessions - tomcat_baby的专栏 - CSDN博客https://blog.csdn.net/tomcat_baby/article/detai ...

  10. 【Python3练习题 020】 求1+2!+3!+...+20!的和

    方法一 import functools   sum = 0 for i in range(1,21):     sum = sum + functools.reduce(lambda x,y: x* ...