题意:有\(n\)个正整数,求随机选取一个3组合,能构成三角形的概率。

Solution: 很容易想到构造权值序列,对其卷积得到任取两条边(可重复)总长度为某数时的方案数序列,我们希望将它转化为两条边不可重复,并去掉顺序。不妨设给定的 \(N\) 个正整数的集合为 \(S\),卷积后的权值序列为 \(\{c_i\}\) ,那么我们对每一个 \(x \in S\), 对 \(c_x\) 减去 \(1\) 即可。

不妨设选出的组合为 \((i,j,k)\),假设 \({x_i}\) 为已经排序的长度序列,那么我们不妨枚举最长边下标 \(k\),那么这一次的贡献为

\[\sum_{k \in S}(\sum_{i=k+1}^{\infty}{c_i})
\]

前缀和扫一遍即可。当然问题并没有这么简单,我们这样获得的答案无法满足下列约束条件

\[k \geq i, k \geq j, i \neq k, j \neq k
\]

如果所有数字都不同,那么去重将是非常容易的。我们对排序后序列枚举元素下标 \(i \in [0,n)\),那么很显然以 \(i\) 为最大边时非法的共有三类。不妨设\(a_i<a_j\)

满足\(a_i>a_k, a_j>a_k\)的共有

\[\frac{(n-i-1)(n-i-2)}{2}
\]

满足\(a_i<a_k, a_j>a_k\)的共有

\[(n-i-1)i
\]

满足\(a_i=a_k or a_j=a_k\)的共有

\[n-1
\]

于是我们暴力统计一遍就可以得到非法数量,进而得出答案。

原问题是可以出现相同大小的数字的,但容易发现它的去重情况与全部不相同并没有什么差异。因而直接按照上述做法即可得出答案。

我们也可以对这个转化的正确性稍作证明。我们将原始序列中的每一个元素 \(x_i\) 映射到一个新元素

\[y_i = x_i - 0.2 + 0.1 \cdot \frac{i}{n}
\]

容易证明\(x_i,x_j,x_k\)可以构成三角形当且仅当\(y_i,y_j,y_k\)可以构成三角形。因此我们通过构造说明了这个转化的正确性。

笔者菜甚,尝试用前缀和直接求解带重复情况失败,留坑在此。

const int N = 200005;
int T,n,m,x[N],a[N],s[N];
double c[N];
double t[N]; int main() {
ios::sync_with_stdio(false);
cin>>T;
while(T--) {
cin>>n;
memset(a,0,sizeof a);
memset(x,0,sizeof x);
memset(s,0,sizeof s);
memset(c,0,sizeof c);
memset(t,0,sizeof t);
for(int i=0;i<n;i++) cin>>x[i];
for(int i=0;i<n;i++) m=max(x[i],m);
for(int i=0;i<n;i++) a[x[i]]++;
poly p,q;
p.c.resize(m+1);
for(int i=0;i<=m;i++) p.c[i]=a[i];
q=p;
double ans = 0;
p*=q;
for(int i=0;i<=2*m;i++) c[i]=(p.c[i]);
for(int i=0;i<n;i++) c[x[i]*2]-=1;
for(int i=0;i<=2*m;i++) c[i]/=2.0;
t[0]=c[0];
for(int i=1;i<=2*m;i++) t[i]=t[i-1]+c[i];
for(int i=0;i<n;i++) ans+=(t[2*m]-t[x[i]]);
sort(x,x+n);
for(int i=0;i<n;i++) {
ans -= (long long)(n-i-1)*(long long)(n-i-2)/2 + (long long)(n-i-1)*(long long)i + (n-1);
}
printf("%.7f\n",6.0*(double)ans / ((double)n*(n-1.0)*(n-2.0)));
}
}

[HDU4609] 3-idiots - 多项式乘法,FFT的更多相关文章

  1. 多项式乘法(FFT)学习笔记

    ------------------------------------------本文只探讨多项式乘法(FFT)在信息学中的应用如有错误或不明欢迎指出或提问,在此不胜感激 多项式 1.系数表示法  ...

  2. 【learning】多项式乘法&fft

    [吐槽] 以前一直觉得这个东西十分高端完全不会qwq 但是向lyy.yxq.yww.dtz等dalao们学习之后发现这个东西的代码实现其实极其简洁 于是趁着还没有忘记赶紧来写一篇博 (说起来这篇东西的 ...

  3. 洛谷.3803.[模板]多项式乘法(FFT)

    题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...

  4. @总结 - 1@ 多项式乘法 —— FFT

    目录 @0 - 参考资料@ @1 - 一些概念@ @2 - 傅里叶正变换@ @3 - 傅里叶逆变换@ @4 - 迭代实现 FFT@ @5 - 参考代码实现@ @6 - 快速数论变换 NTT@ @7 - ...

  5. [uoj#34] [洛谷P3803] 多项式乘法(FFT)

    新技能--FFT. 可在 \(O(nlogn)\) 时间内完成多项式在系数表达与点值表达之间的转换. 其中最关键的一点便为单位复数根,有神奇的折半性质. 多项式乘法(即为卷积)的常见形式: \[ C_ ...

  6. UOJ 34 多项式乘法 FFT 模板

    这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...

  7. [HNOI2017] 礼物 - 多项式乘法FFT

    题意:给定两个 \(n\) 元环,环上每个点有权值,分别为 \(x_i, y_i\).定义两个环的差值为 \[\sum_{i=0}^{n-1}{(x_i-y_i)^2}\] 可以旋转其中的一个环,或者 ...

  8. 【Luogu3808】多项式乘法FFT(FFT)

    题目戳我 一道模板题 自己尝试证明了大部分... 剩下的还是没太证出来... 所以就是一个模板放在这里 以后再来补东西吧.... #include<iostream> #include&l ...

  9. 【模板】多项式乘法(FFT)

    题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: 第一行2个正整数n,m. 接下来一行n+1个数字,从低到高表示F(x)的系 ...

随机推荐

  1. maven的核心概念——创建war工程

    第十七章第四个Maven工程(war工程) 17.1 创建步骤 ①第一步:创建maven web工程 ②第二步:修改web.xml <?xml version="1.0" e ...

  2. sbt package报错:a bytes-like object is required, not 'str'

    Traceback (most recent call last): File , in <module> s.sendall(content) TypeError: a bytes-li ...

  3. C#加密与解密(DES\RSA)学习笔记

    本笔记摘抄自:https://www.cnblogs.com/skylaugh/archive/2011/07/12/2103572.html,记录一下学习过程以备后续查用. 数据加密技术是网络中最基 ...

  4. Miller-Rabin素数检测算法 acm模板

    Miller-Rabin素数检测算法 其基于以下两个定理. Fermat小定理 若n是素数,则∀a(a̸≡0(modn))\forall a(a \not\equiv 0 \pmod{n})∀a(a̸ ...

  5. thinkphp 5.0 后台数据修改

    html代码 <table class="easyui-datagrid" data-options="singleSelect:true,collapsible: ...

  6. web端常见测试

    一.登录注册功能 1.页面调转 2.tab键与enter键 3.密码加密显示,是否支持复制粘贴 4.账号密码校验 5.刷新页面,更新验证码 二.界面测试 1.样式.颜色.整体布局风格 2.最大化.最小 ...

  7. Linux 常用命令 服务器间scp 用户 export 创建文件、软连接

    获取外网ip curl icanhazip.com 服务器间的 文件 复制 scp root@ip:/源目录 目标目录 软连接 查看软连接 ls -li 创建软连接 ln -s 源文件 目标文件 -s ...

  8. springboot~工作流activiti的搭建

    概念 工作流产品使用activiti的算是比较多了,自带了一套UI界面,可以直接使用,用来设计流程,下面简单总结一下它的步骤: 1 设计模型 2 发布为流程,一个模型可以发布多个版本的流程 3 建立一 ...

  9. gulp 对js\css进行md5 加密

    有的服务器为了网站加载速度,会做服务器缓存,这样就会出现代码出现引用地址没变,新代码不生效,而我们又希望新代码可以及时生效,这样我们就需要避免缓存,当然也有很多方法,本文只介绍使用gulp-rev(对 ...

  10. 洛谷P1308 统计单词数

    原题链接:https://www.luogu.org/problem/P1308 #include<iostream> #include<cstring> #include&l ...