HDU4609:3-idiots(FFT)
Description

Input

Output

Sample Input

Sample Output

Solution
题意:给你$n$根木棍,问你任选三根能构成三角形的概率是多少。
写挂sb细节心态崩了
首先把读入的长度$a$数组开个桶$c$存下来,然后卷积一下$c$数组。可以发现卷完后的数组$c$就是“任选两根木棍(可以重复选)长度和为$c[i]$的方案数。”
因为有可能自己和自己算到一起,所以$c[a[i]*2]--$。因为$i+j$,$j+i$是一种,所以要$c[i]=c[i]/2$。
对$c$数组做一下前缀和,记为$sumd$。然后$sort$一下$a$数组,从小到大枚举,统计当$a[i]$为三角形最长边时的方案数,则另外两边之和$>a[i]$。$ans+=sumd[MAX*2]-sumd[a[i]]$
同时这些方案里面还有一些不合法的方案。
另外两条边两条均$>ai$,$ans-=(n-i)*(n-i-1)/2$
另外两条边一条$>ai$,一条$<ai$,$ans-=(n-i)*(i-1)$
另外两条边一条$=ai$,另一条随意,$ans-=n-1$
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define N (400009)
#define LL long long
using namespace std; LL T,n,ans,a[N],fn,l,r[N],d[N],sumd[N],MAX; double pi=acos(-1.0);
struct complex
{
double x,y;
complex (double xx=,double yy=)
{
x=xx; y=yy;
}
}c[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);}
complex operator / (complex a,double b){return complex(a.x/b,a.y/b);} void FFT(int n,complex *a,int opt)
{
for (int i=; i<n; ++i)
if (i<r[i])
swap(a[i],a[r[i]]);
for (int k=; k<n; k<<=)
{
complex wn=complex(cos(pi/k),opt*sin(pi/k));
for (int i=; i<n; i+=(k<<))
{
complex w=complex(,);
for (int j=; j<k; ++j,w=w*wn)
{
complex x=a[i+j], y=w*a[i+j+k];
a[i+j]=x+y; a[i+j+k]=x-y;
}
}
}
if (opt==-) for (int i=; i<n; ++i) a[i]=a[i]/n;
} int main()
{
scanf("%lld",&T);
while (T--)
{
memset(c,,sizeof(c));
memset(r,,sizeof(r));
l=; ans=; MAX=;
scanf("%lld",&n);
for (int i=; i<=n; ++i)
{
scanf("%lld",&a[i]);
c[a[i]].x++;
}
sort(a+,a+n+); MAX=a[n];
fn=;
while (fn<=MAX*) fn<<=, l++;
for (int i=; i<fn; ++i)
r[i]=(r[i>>]>>) | ((i&)<<(l-));
FFT(fn,c,);
for (int i=; i<fn; ++i)
c[i]=c[i]*c[i];
FFT(fn,c,-);
for (int i=; i<fn; ++i)
d[i]=((LL)(c[i].x+0.5));//一开始括号里写成int了……
for (int i=; i<=n; ++i)
d[a[i]*]--;
for (int i=; i<=MAX*; ++i)
d[i]>>=, sumd[i]=sumd[i-]+d[i];
for (int i=; i<=n; ++i)
{
ans+=sumd[MAX*]-sumd[a[i]];
ans-=(n-i)*(n-i-)/;//两条都大于a[i]
ans-=(n-i)*(i-);//一条大于,一条小于
ans-=n-;//一条等于,一条随意
}
printf("%.7lf\n",1.0*ans/(n*(n-)*(n-)/));
}
}
HDU4609:3-idiots(FFT)的更多相关文章
- bzoj 3513: [MUTC2013]idiots FFT
bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...
- [HDU4609]3-idiots(生成函数+FFT)
3-idiots Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- bzoj 3513 [MUTC2013]idiots FFT 生成函数
[MUTC2013]idiots Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 806 Solved: 265[Submit][Status][Di ...
- BZOJ3513[MUTC2013]idiots——FFT+生成函数
题目描述 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. 输入 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个 ...
- 【hdu4609】 3-idiots FFT
题外话:好久没写blog了啊-- 题目传送门 题目大意:给你m条长度为ai的线段,求在其中任选三条出来,能构成三角形的概率.即求在这n条线段中找出三条线段所能拼出的三角形数量除以$\binom{m}{ ...
- [MUTC2013][bzoj3513] idiots [FFT]
题面 传送门 思路 首先有一个容斥原理的结论:可以组成三角形的三元组数量=所有三元组-不能组成三角形的三元组 也就是说我们只要求出所有不能组成三角形的三元组即可 我们考虑三元组(a,b,c),a< ...
- 【bzoj3513】[MUTC2013]idiots FFT
题目描述 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. 输入 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个 ...
- HDU4609 & FFT
关于这道题请移步kuangbin爷的blog:http://www.cnblogs.com/kuangbin/archive/2013/07/24/3210565.html 感觉我一辈子也不能写出这么 ...
- HDU4609 3-idiots(母函数 + FFT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4609 Description King OMeGa catched three men wh ...
- HDU-4609(FFT/NTT)
HDU-4609(FFT/NTT) 题意: 给出n个木棒,现从中不重复地选出3根来,求能拼出三角形的概率. 计算合法概率容易出现重复,所以建议计算不合法方案数 枚举选出的最大边是哪条,然后考虑剩下两条 ...
随机推荐
- 微信小程序,关于设置data里面的数据。
关于设置 data里面的数据 wxml: <view>{{userName}}</view> data: { userName:'张三', } 有两种方法 方法一:直接使用点关 ...
- 【转】解决IDEA新建项目名称为红色
idea如果当前project用了版本控制器,其下面新建的所有的项目默认都是加入到版本控制里面,所以项目名称和文件都是红色的,如图: File-->Settings-->version c ...
- Idea生成Javadoc
Idea tools菜单下:Generate Javadoc...,在弹出的对话框中选择指定的包或文件,也可滤掉指定的包或文件.如果有自定义的javadoc标签,则需要在other command l ...
- 撩课-Web大前端每天5道面试题-Day26
1.vuejs与angularjs以及react的区别? .与AngularJS的区别 相同点: 都支持指令:内置指令和自定义指令. 都支持过滤器:内置过滤器和自定义过滤器. 都支持双向数据绑定. 都 ...
- idea 中如何生成类图
前言:记录一下 idea 中如何生成类图,毕竟类图在开发或看源码时用得特别多. 推荐博客:https://blog.csdn.net/zhangle1hao/article/details/78804 ...
- win10 安装oracle 11gR2_database出现universal Installer后闪退就没反应的解决方案
前言:本机为 win 10 64位系统,安装oracle win64_11gR2_database的时候出现问题,安装不了,经排查解决了此问题.转载请注明出处:https://www.cnblogs. ...
- Unix Programming :文件IO
文件描述符常量(unistd.h): STDIN_FILENO STDOUT_FILENO STDERR_FILENO 通常这些常量分别对应于数字0,1,2 文件操作需要头文件 fcntl.h ,一些 ...
- Javascript中的bind详解
前言 用过React的同学都知道,经常会使用bind来绑定this. import React, { Component } from 'react'; class TodoItem extends ...
- css之背景(background)家族
背景(background)是css中很重要的一部分,也是css的基础知道之一,现在来回顾css2中5个属性与css3中新增的3个属性和2个功能. CSS2_背景(background)前传 家族成员 ...
- 基于Maven + SSM (Spring、SpringMVC、Mybatis)构建一个简单的测试项目
最近在公司实习期间的培训交流中有机会接触到SSM,然后自己花费1周的时间投入学习.谈不上深刻理解其中原理,所以没有涉及理论知识,只是浅层次的学习如何使用,在此将学习过程记录整理出来,一方面自己备用:另 ...