hdu 4609 3-idiots
http://acm.hdu.edu.cn/showproblem.php?pid=4609
FFT 不会 找了个模板
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std; typedef long long ll;
typedef pair<double,double>ppd;
const double PI = acos(-1.);
const int MAXL = (1 << 18)+100;
int a[MAXL],b[MAXL];
ll c[MAXL];
ppd A[MAXL],B[MAXL],C[MAXL],T[MAXL];
int id,ln;
void fill0(int m,int d,int *s,ppd *P)
{
if (m == ln)
P[d] = make_pair(s[id++],0.0);
else
{
fill0(m<<1,d,s,P);
fill0(m<<1,d+m,s,P);
}
} void fill1(int m,int d,ppd *C,ppd *P)
{
if (m == ln) P[d] = C[id++];
else
{
fill1(m<<1,d,C,P);
fill1(m<<1,d+m,C,P);
}
} void fft(double oper,ppd *P)
{
for (int d = 0;(1 << d) < ln;++d)
{
int m = (1 << d);
double p0 = PI / m * oper;
double sinp0 = sin(p0);
double cosp0 = cos(p0);
for (int i = 0;i < ln;i += (m << 1))
{
double sinp = 0;
double cosp = 1;
for (int j = 0;j < m;++j)
{
double ta = cosp * P[i+j+m].first - sinp*P[i+j+m].second;
double tb = cosp * P[i+j+m].second + sinp * P[i+j+m].first;
P[i+j+m].first = P[i+j].first - ta;
P[i+j+m].second = P[i+j].second - tb;
P[i+j].first += ta;
P[i+j].second += tb;
double tsinp = sinp;
sinp = sinp * cosp0 + cosp * sinp0;
cosp = cosp * cosp0 -tsinp * sinp0;
}
}
}
}
void polyMul(int *a,int *b,ll *c,int n)
{
ln=(1<<18);
while((ln>>2)>=n) ln=ln>>1;
id = 0;
fill0(1,0,a,A);
fft(1.0,A);
id = 0;
fill0(1,0,b,B);
fft(1.0,B);
for (int i = 0;i < ln;++i)
{
C[i].first = A[i].first * B[i].first - A[i].second * B[i].second;
C[i].second = A[i].first * B[i].second + A[i].second * B[i].first;
}
id = 0;
fill1(1,0,C,T);
fft(-1.0,T);
for (int i = 0;i < ln;++i)
c[i] = ll(T[i].first / ln + 0.1);
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("1010.in","r",stdin);
//freopen("my.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
int m;
scanf("%d",&m);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n=0;
for(int i=0;i<m;++i)
{
int tmp=0;
scanf("%d",&tmp);
n=max(n,tmp);
++a[tmp];
++b[tmp];
}
++n;
polyMul(a,b,c,n);
for(int i=0;i<n;++i)
if(a[i])
c[i+i]-=a[i];
for(int i=0;i<ln;++i)
c[i]=c[i]>>1; double tmp=0.0;
double t=0;
for(int i=0;i<n;++i)
{
t+=c[i];
tmp+=(a[i]*t);
}
double sum=(1.0*m*(m-1)*(m-2)/2/3);
printf("%.7lf\n",(sum-tmp)/sum);
}
return 0;
}
hdu 4609 3-idiots的更多相关文章
- 解题:HDU 4609 Three Idiots
题面 要求组合的方法显然我们需要对桶卷积,即设$F(x)=\sum\limits_{i=1}^{maxx}x^{cnt[i]}$,然后我们初步的先把$F^2(x)$卷出来,表示选两条边.然后我们发现如 ...
- 快速傅里叶变换应用之二 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(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 ...
随机推荐
- Maven核心概念之依赖,聚合与继承
一.依赖 我们项目中依赖的jar包可以通过依赖的方式(dependencies元素下添加dependency子元素)引入. <dependency> <groupId>juni ...
- (三)ubuntu学习前传—uboot常见环境变量
1.环境变量如何参与程序运行(1)环境变量有2份,一份在Flash中,另一份在DDR中.uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR ...
- (转)springAOP解析-1
原文:http://hzbook.group.iteye.com/group/wiki/2261-Spring 3.1 Spring AOP概述 3.1.1 AOP概念回顾AOP是Aspect-O ...
- phalcon:数据库分库,读写分离,负载均衡 系统方法执行顺序
phalcon:数据库分库,读写分离,负载均衡 系统方法执行顺序 用命名空间区分不同的数据库实例,对应代码结构上是不同的目录区分,在同一目录下基类负责初始化连接.连接来自初始化时注入的多个db服务 隐 ...
- 在XP下基于VHD版XP 2003 win7制作的RAMOS心得
在XP下基于VHD版win7制作的RAMOS心得1.用DiskGenius创建1.85G的VHD固定磁盘文件,以win7prosen.vhd为例,然后进行分区格式化,格式化时启用NTFS压缩.2.为了 ...
- assert的用处
ASSERT函数是用于调试中,也就是说在你的代码中当是Debug的时候它完成对参数的判断,如果是TRUE则什么都不做,如果是FALSE则弹出一个程序中断对话框提示程序出现错误.在Release版本中它 ...
- 十问 Linux 虚拟内存管理 (glibc) (二)
版权声明:本文由陈福荣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/184 来源:腾云阁 https://www.qclo ...
- Unity5.3官方VR教程-系列1
如果你不是VR游戏或应用的开发者,可以选择无视下面的内容,这不是给普通用户看的~ 如果你之前曾经为Oculus Rift DK2或者Gear VR开发过,那么心里面一定曾经有千万个草泥马来回奔跑过.虽 ...
- 关于MySQL回滚机制
在事务中,每个正确的原子操作都会被顺序执行,直到遇到错误的原子操作,此时事务会将之前的操作进行回滚.回滚的意思是如果之前是插入操作,那么会执行删 除插入的记录,如果之前是update操作,也会执行up ...
- python 练习24
Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串. 语法: for循环的语法格式如下: for iterating_var in sequence: statements(s) ...