解题:HDU 4609 Three Idiots
要求组合的方法显然我们需要对桶卷积,即设$F(x)=\sum\limits_{i=1}^{maxx}x^{cnt[i]}$,然后我们初步的先把$F^2(x)$卷出来,表示选两条边。然后我们发现如果用“两边之和大于第三边”来求,那么小于这两条边的可能不是最长的,所以应该枚举大于这两条边的来容斥
注意题目中提到了不能选重复的,所以对于所有指数为偶数的项去重,还有题目要求是无序地选
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,K=4e5;
const double pai=acos(-);
struct cpx
{
double x,y;
}a[N];
cpx operator + (cpx a,cpx b)
{
return (cpx){a.x+b.x,a.y+b.y};
}
cpx operator - (cpx a,cpx b)
{
return (cpx){a.x-b.x,a.y-b.y};
}
cpx operator * (cpx a,cpx b)
{
double x1=a.x,x2=b.x,y1=a.y,y2=b.y;
return (cpx){x1*x2-y1*y2,x1*y2+x2*y1};
}
long long cnt[N],tot,ans;
int mem[N],rev[N],lgg[N];
double Sin[M],Cos[M];
int n,m,T,rd;
int Round(double x)
{
return (int)(x+0.5);
}
void Prework()
{
scanf("%d",&T);
for(int i=;i<=K;i++)
lgg[i]=lgg[i>>]+;
for(int i=;i<=;i++)
Sin[i]=sin(*pai/(<<i)),Cos[i]=cos(*pai/(<<i));
}
void Trans(cpx *c,int t)
{
for(int i=;i<n;i++)
if(rev[i]>i) swap(c[rev[i]],c[i]);
for(int i=;i<=n;i<<=)
{
int len=i>>;
cpx omg=(cpx){Cos[lgg[i]],Sin[lgg[i]]*t};
for(int j=;j<n;j+=i)
{
cpx ori=(cpx){,},tmp;
for(int k=j;k<j+len;k++,ori=ori*omg)
tmp=ori*c[k+len],c[k+len]=c[k]-tmp,c[k]=c[k]+tmp;
}
}
if(t==-) for(int i=;i<n;i++) c[i].x/=n;
}
int main()
{
Prework();
while(T--)
{
scanf("%d",&n);
memset(mem,,sizeof mem),m=;
for(int i=;i<=n;i++)
{
scanf("%d",&rd);
mem[rd]++,m=max(m,rd);
}
ans=tot=1ll*n*(n-)*(n-)/,n=; while(n<=m*) n<<=;
for(int i=;i<n;i++) a[i].x=mem[i],a[i].y=;
for(int i=;i<n;i++) rev[i]=(rev[i>>]>>)+(i&)*(n>>);
Trans(a,);
for(int i=;i<n;i++) a[i]=a[i]*a[i];
Trans(a,-);
for(int i=;i<=m;i++) cnt[i]=Round(a[i].x);
for(int i=;i<=m;i++)
{
if(i%==) cnt[i]-=mem[i>>];
cnt[i]>>=,cnt[i]+=cnt[i-];
}
for(int i=;i<=m;i++) ans-=cnt[i]*mem[i];
printf("%.7f\n",(double)ans/tot);
}
return ;
}
解题:HDU 4609 Three Idiots的更多相关文章
- 快速傅里叶变换应用之二 hdu 4609 3-idiots
快速傅里叶变化有不同的应用场景,hdu4609就比较有意思.题目要求是给n个线段,随机从中选取三个,组成三角形的概率. 初始实在没发现这个怎么和FFT联系起来,后来看了下别人的题解才突然想起来:组合计 ...
- hdu 4609 3-idiots [fft 生成函数 计数]
hdu 4609 3-idiots 题意: 给出\(A_i\),问随机选择一个三元子集,选择的数字构成三角形的三边长的概率. 一开始一直想直接做.... 先生成函数求选两个的方案(注意要减去两次选择同 ...
- hdu 4609 3-idiots <FFT>
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 给定 N 个正整数, 表示 N 条线段的长度, 问任取 3 条, 可以构成三角形的概率为多 ...
- hdu 4609 3-idiots
http://acm.hdu.edu.cn/showproblem.php?pid=4609 FFT 不会 找了个模板 代码: #include <iostream> #include ...
- HDU 4609 3-idiots(FFT)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给出n个正整数(数组A).每次随机选出三个数.问这三个数能组成三角形的概率为多大? 思路: ...
- HDU 4609 FFT模板
http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给你n个数,问任意取三边能够,构成三角形的概率为多少. 思路:使用FFT对所有长度的个数进行卷积(\ ...
- hdu 4609 3-idiots——FFT
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609 答案就是随便选三条边的方案 - 不合法的方案. 不合法的方案就是算出 x+y = k 的方案数 g[ ...
- hdu 4609 3-idiots —— FFT
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609 算不合法的比较方便: 枚举最大的边,每种情况算了2次,而全排列算了6次,所以还要乘3: 注意枚举最大 ...
- FFT(快速傅里叶变换):HDU 4609 3-idiots
3-idiots Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
随机推荐
- 02-matplotlib-散点图
import numpy as np import matplotlib.pyplot as plt ''' 散点图显示两组数据的值,每个点的坐标位置的值决定 用户观察两种变量的相关性: 正相关 负相 ...
- nohup命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/hfismyangel/article/details/80258126 1.nohup 用途:不挂断地运行命令. 语法:n ...
- [Notice]博客地址转移 vitostack.com
个人博客地址转移至vitostack.com 这里可能不会经常更新. 欢迎访问新地址.
- Django_cookie+session
一.cookie和session介绍 cookie 由服务器产生内容,浏览器收到请求后保存在本地:当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁 ...
- $.each()用法
通过它,你可以遍历对象.数组的属性值并进行处理. 使用说明 each函数根据参数的类型实现的效果不完全一致: 1.遍历对象(有附加参数) $.each(Object, function(p1, p2) ...
- 第十三次作业psp
psp 进度条 代码累积折线图 博文累积折线图 psp饼状图
- spring冲刺第九天
昨天使炸弹可以炸死人物并可以炸没砖块,并试着将小怪加入地图. 今天设计游戏的道具,比如吃了道具人物反方向运动等. 遇到的问题设计不够完善,道具单一.
- 浅谈Java中的Hashmap
HashMap: java.lang.Object ∟ java.util.AbstractMap<K,V> ∟ java.util.HashMap<K,V> 类型参数: ...
- 牛客网国庆集训派对Day4题目 2018年
链接:https://www.nowcoder.com/acm/contest/204/A来源:牛客网 深度学习 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他 ...
- 第三章 深入Servlet技术
3.1 配置Servlet <servlet-name>,<servlet-class>是必须配置的,以便于web容器知道浏览器具体访问的是哪个servlet. <ini ...