[FFT] [HDU4609] 3-idiots

题目传送门
下面还是我的翻译
题目描述 Description

OMeGa国王抓住了三个在街上裸奔的人。虽然他们被看做是智障,这三个人坚持说只是一种行为艺术,然后乞求国王放了他们。出于对真正智障的仇恨,国王想测试一下他们是不是说谎了。这三个人被送到了国王的森林中,并且每个人都被要求依次捡一根树枝。如果他们带来的三根树枝能构成一个三角形,他们的数学能力就会解救他们。否则,他们就会蹲监狱……
然而,这三个确实是智障,并且他们会做的只是随机的选取树枝。当然他们不能捡相同的树枝(已经被取过的树枝)——但是与另一个相同长度的树枝是可以取得的。
给出森林里所有树枝的长度,计算他们获救的可能性。

输入 Input

输入的第一行会有一个整数 T ( T ≤ 100 ) T(T\le 100) TT100,表示测试数据的组数;
每组数据以树枝数 N ( 3 ≤ N ≤ 1 0 5 ) N(3\le N\le 10^5) N3N105开始,下一行包含 N N N个整数 a i ( 1 ≤ a i ≤ 1 0 5 ) a_i(1\le a_i\le 10^5) ai1ai105,分别表示每个树枝的长度。

输出 Output

输出他们能够构成三角形的可能性,保留7位小数。

嗯构成三角形……需要满足的是两最小边之和大于第三边。
如果暴力的话是 O ( n 3 ) O(n^3) O(n3)的,过不去……
如果我们能搞出确定的两最小边之和有多少种方案,再拿第三边的方案数与其相乘不就好了?
嗯这种方法是 O ( n 2 ) O(n^2) O(n2)的还是过不去……
于是考虑构造一个单项式 a x b ax^b axb,其中 a a a表示 b b b长度的边的个数,那么 a 1 a 2 x b 1 + b 2 a_1a_2x^{b_1+b_2} a1a2xb1+b2中的 a 1 a 2 a_1a_2 a1a2就是我们想要的两最小边之和的方案数。
那么我们构造出来这样的一个多项式
∑ i = 1 n a i x b i \sum\limits_{i=1}^na_ix^{b_i} i=1naixbi
对它平方,就可以在 O ( n log ⁡ 2 n ) O(n\log_2 n) O(nlog2n)的时间搞出来所有我们想要的东西。
然后当然是要变化一下的。我们发现在统计中,可能出现一个边重复使用两次的情况,所以需要把它减去。又发现在统计中 b 1 b_1 b1 b 2 b_2 b2边被重复计算了一次,所以得到的方案数应除以2。
然后就可以 O ( n ) O(n) O(n)扫一遍第三边,把不合法的减去即可。
总时间复杂度为 O ( T ( n log ⁡ 2 n + n ) ) O(T(n\log_2 n+n)) O(T(nlog2n+n))
Code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值