bzoj 3513: [MUTC2013]idiots FFT

链接

bzoj

思路

参考了学姐TRTTG的题解

统计合法方案,最后除以总方案。

合法方案要不好统计,统计不合法方案。

\(a+b<=c\)的个数

f[i]是i出现的个数

g[i]表示a+b=i的个数,a<=b

这个可以fft加速到\(nlogn\)统计.

具体的,fft算出ff的卷积,减去自己自己的贡献,然后/2就是了g[i]。

不合法方案数就是:\(\sum f[i]*g[i]\)

最终答案是\(ans=\frac{C_n^3-tot}{C_n^3}\)

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4e5+7;
const double Pi=acos(-1.0);
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,m,r[N],limit=1,l;
struct Complex {
double x,y;
Complex(double xx=0,double yy=0) {x=xx,y=yy;}
}a[N],b[N];
Complex operator + (Complex a,Complex b) {return Complex(a.x+b.x,a.y+b.y);}
Complex operator - (Complex a,Complex b) {return Complex(a.x-b.x,a.y-b.y);}
Complex operator * (Complex a,Complex b) {return Complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
void fft(Complex *a,int type) {
for(int i=0;i<=limit;++i)
if(i<r[i]) swap(a[i],a[r[i]]);
for(int mid=1;mid<limit;mid<<=1) {
Complex Wn(cos(Pi/mid),type*sin(Pi/mid));
for(int i=0;i<limit;i+=mid<<1) {
Complex w(1,0);
for(int j=0;j<mid;++j,w=w*Wn) {
Complex x=a[i+j],y=w*a[i+j+mid];
a[i+j]=x+y;
a[i+j+mid]=x-y;
}
}
}
}
ll f[N],g[N],sum[N];
void solve() {
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
n=read();
for(int i=1;i<=n;++i) f[read()]++;
for(int i=0;i<=limit;++i) a[i].x=f[i];
fft(a,1);
for(int i=0;i<=limit;++i) a[i]=a[i]*a[i];
fft(a,-1);
for(int i=0;i<=limit;++i)
g[i]=(int)(a[i].x/limit+0.5);
for(int i=0;i<=limit;++i) g[i*2]-=f[i];
for(int i=0;i<=limit;++i) g[i]>>=1;
for(int i=0;i<=limit;++i) g[i]+=g[i-1];
ll tot=0;
for(int i=0;i<=limit;++i) tot+=1LL*f[i]*g[i];
ll ans=1LL*n*(n-1)*(n-2)/6;
printf("%.7lf\n",(double)(ans-tot)/ans);
}
int main() {
while(limit<=200000) limit<<=1,l++;
for(int i=0;i<=limit;++i)
r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
for(int T=read();T;T--) solve();
return 0;
}

bzoj 3513: [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

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

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

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

  4. 【刷题】BZOJ 3513 [MUTC2013]idiots

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

  5. BZOJ3513[MUTC2013]idiots——FFT+生成函数

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

  6. 【bzoj3513】[MUTC2013]idiots FFT

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

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

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

  8. [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块)

    [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块) 题面 给出一个长度为n的数组,问有多少三元组\((i,j,k)\)满足\(i<j<k,a_j-a_i=a_ ...

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

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

随机推荐

  1. WinAPI 字符及字符串函数(5): IsCharAlpha - 是否是个字母

    unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

  2. struct与class的区别

    C++中的struct是对C中struct的扩充,它已经不再只是一个包含不同数据类型的数据结构,因为其扩充了太多功能.总的来说,C++中struct和class极其相似,比如,struct能包含成员函 ...

  3. pc端 页面 显示在手机 一行控制适配问题

    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">

  4. spring 数据库多数据源路由

    项目中需要根据不同业务进行分库,首先是将业务不同业务映射到不同过的数据库( biz --> db,可能存在多对一情况), 查看springjdbc源码发现AbstractRoutingDataS ...

  5. vi光标移动

    1.上下左右移动 k  :上移一行 j  :下移一行 h :左移一行 l :右移一行 2.移到当前屏幕的首.中.尾部 H :移到当前屏幕的首部 M    :移到当前屏幕的中部 L :移到当前屏幕的尾部 ...

  6. 2019.04.21 python核心特征

    本阶段我们将了解Python是如何管理内存的,学习内存管理让我们掌握python的运行机制: 并且在python中有许多函数式编程的特性,比如闭包,装饰器和生成器,这些都是一些比较难掌握的概念,但面试 ...

  7. Linux 7.x 防火墙&端口

    Linux 7.x 防火墙&端口 查看当前防火墙的状态: # firewall-cmd --state 也可以使用指令:systemctl status firewall.service 启动 ...

  8. PHP7的异常处理机制,set_error_handler和set_exception_handler方法介绍

    https://blog.csdn.net/zhang197093/article/details/75094816

  9. TypeScript之interface初探

    TypeScript的核心原则之一是对值所具有的结构进行类型检查,在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约. function printLabel(la ...

  10. 2018-2019-2 《网络对抗技术》 Exp1 PC平台逆向破解 20165215

    2018-2019-2 <网络对抗技术> Exp1 PC平台逆向破解 20165215 目录 知识点描述 实验步骤 (一)直接修改程序机器指令,改变程序执行流程 (二)通过构造输入参数,造 ...