HDU - 4609

思路:
记录每个木棍长度出现的次数,然后就可以用用类似多项式的乘法(专业术语:卷积,因为是下标和为一特定值的积的和(x+y=k),相当于在笛卡尔坐标系中将这条直线卷起来,故得名卷积)的方法计算两个组合后每个长度的木棍的个数,然后用容斥减去多余的。

然后对它求个前缀和sum

假设两个组合最长木棍为l

然后再枚举n个木棍,假设当前的ai为最大的木棍,

另外两个木棍的和肯定大于ai,所以方案数加sum[l] - sum[ai]

减去另外两个都大于它的情况,也就是减去(n-i-1)*(n-i-2)/2

减去一大一小的情况,也就是减去i*(n-i-1)

减去一个为本身,一个为其他的情况,也就是减去n-1

最后拿方案数除以所有的情况n*(n-1)*(n-2)/6

代码:

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pii pair<int, int>
#define piii pair<int,pii>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//headconst int N = 4e5 + 10;
int a[N], R[N];
LL num[N],sum[N];
struct Complex {double x, y;Complex(double _x=0, double _y=0) : x(_x),y(_y) {};Complex operator + (Complex &t) {return Complex(x+t.x, y+t.y);}Complex operator - (Complex &t) {return Complex(x-t.x, y-t.y);}Complex operator * (Complex &t) {return Complex(x*t.x - y*t.y, x*t.y + y*t.x);}
}X[N];
void fft(Complex *x, int n, int type) {for (int i = 0; i < n; i++) if(i < R[i]) swap(x[i], x[R[i]]);for (int i = 1; i < n; i<<=1) {Complex wn(cos(pi/i), type*sin(pi/i));for (int j = 0; j < n; j+=i<<1) {Complex w(1, 0);for (int k = 0; k < i; k++, w=w*wn) {Complex X = x[j+k];Complex Y = w*x[j+k+i];x[j+k] = X + Y;x[j+k+i] = X - Y;}}}
}
int main() {int T, n;scanf("%d", &T);while(T--) {mem(num, 0);scanf("%d", &n);for (int i = 0; i < n; i++) scanf("%d", &a[i]), num[a[i]]++;sort(a, a+n);int len = a[n-1] + 1;int l = 1, L = 0;for (int i = 0; i < len; i++) X[i] = Complex(num[i], 0);for ( ; l < len*2; l <<= 1) L++;for (int i = len; i < l; i++) X[i] = Complex(0, 0);for (int i = 0; i < l; i++) {R[i] = (R[i>>1]>>1)|((i&1)<<L-1);}fft(X, l, 1);for (int i = 0; i < l; i++) X[i] = X[i]*X[i];fft(X, l, -1);for (int i = 0; i < l; i++) num[i] = (LL)(X[i].x/l + 0.5);for (int i = 0; i < n; i++) num[a[i]+a[i]]--; for (int i = 0; i < l; i++) num[i] /= 2;sum[0] = num[0];for (int i = 1; i < l; i++) sum[i] = sum[i-1] + num[i]; LL ans = 0;for(int i = 0; i < n; i++) {ans += sum[l-1] - sum[a[i]];ans -= 1LL * (n-i-1) * i;ans -= 1LL * (n-i-1) * (n-i-2) / 2;ans -= n-1;} LL t = 1LL*n*(n-1)*(n-2)/6;printf("%.7f\n", (double)ans/t);}return 0;
}

PS:长度可以扩展一点,后面是0都没关系,只要长度是2的幂次就可以

转载于:https://www.cnblogs.com/widsom/p/9155012.html

HDU 4609 3-idiots相关推荐

  1. 快速傅里叶变换应用之二 hdu 4609 3-idiots

    快速傅里叶变化有不同的应用场景,hdu4609就比较有意思.题目要求是给n个线段,随机从中选取三个,组成三角形的概率. 初始实在没发现这个怎么和FFT联系起来,后来看了下别人的题解才突然想起来:组合计 ...

  2. hdu 4609 3-idiots(FFT计数)

    题目链接:hdu 4609 3-idiots 题意: 给你n条线段.问随机取三个,可以组成三角形的概率. 题解: FFT搞,具体可看kuangbin菊苣的详细题解:传送门 1 #include< ...

  3. HDU 4609 3-idiots FFT

    3-idiots 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4609 Description King OMeGa catched three m ...

  4. HDU 4609 3idiots

    第一道FFT,研究了kuangbin神的版子,发现想不太通,不过基本的意思都懂了,就是用一个数组的权和另一个数组的权求和,计算个数.题目中有不少坑点. #include <cstdio> ...

  5. HDU 4609 FFT

    题目大意 给定n条边的边值,求任意取三条边能组成三角形的概率 这里概率 P = valid/tot tot = (n-2)*(n-1)*n/6是没问题的 valid表示合法的方式 先考虑,任意两条边组 ...

  6. HDU 4609 3-idiots(FFT)

    3-idiots 思路 多项式卷积的经典应用了: 看样例一: 4 1 3 3 4 我们用多项式系数表示得到一个与aia_iai​有关的多项式:010210\ 1\ 0\ 2\ 10 1 0 2 1, ...

  7. HDU 4609——3-idiots

    题意: 给定n个数,随机从这n个数中取3个数,问能组成三角形的概率是多少? 思路: 首先把统计这n个数出现的个数,那么会得到一个向量,这个向量的自我的乘积就是a[i]+a[j]的可能的方案数,这样,我 ...

  8. 3-idiots HDU - 4609 FFT模板

    给N个木棍问任选三个可组合出三角形的概率 以前写的,整理整理存个档 //#pragma comment(linker, "/STACK:1024000000,1024000000" ...

  9. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

最新文章

  1. Mac终端(Terminal)自定义颜色,字体,背景
  2. 仿windows造字程序的 ASP.NET图片组合生成控件
  3. PostgreSQL在何处处理 sql查询
  4. java 英文分词器使用代码_java文本英文分词
  5. php中mysqlstat函数,PHP函数mysql_stat介绍
  6. iOS开发--开发者帐号
  7. c底层用什么网站编写服务器,c编写服务器
  8. 头歌Educoder——大数据Hadoop开发环境搭建
  9. 全局唯一序列号生成器-支持分布式
  10. mysql 表间关联查询
  11. blast2go mysql_从 Blast2GO 本地化聊一聊 Linux 下 MySQL 的源码安装
  12. 10-Little prince's trip to Java-奇数魔方阵
  13. win7系统关闭蓝牙服务器,win7系统蓝牙服务被禁用的解决方法
  14. 计算机策略删除必须要一个密码,取消电脑开机密码
  15. vue中的attribute 和 property 是什么意思
  16. 120. Triangle(三角矩阵)
  17. 鼻咽癌有什么症状表现?
  18. CentOS7设置GRUB系统内核开机选单
  19. glibc 知:手册21:日期和时间
  20. 七夕第一波狗粮来啦!魏晨晒婚纱照,与妻子爱情长跑十年成眷属

热门文章

  1. .net 读word中文字方法
  2. Linux下服务器模型 【转载】
  3. 精算模型1 一元生存分析3 条件概率与截尾分布
  4. C语言函数指针的MFC版本Demo
  5. C++ 变量的定义位置
  6. generator (1)
  7. python之路-day19-面向对象之约束
  8. python中的全局变量与局部变量
  9. KMP,深入讲解next数组的求解(转载)
  10. ProjectManagement::Redmine备份与恢复