您的位置:首页 > 大数据 > 物联网

[FFT] [HDU4609] 3-idiots

2017-05-29 22:41 239 查看
题目传送门

下面还是我的翻译

题目描述 Description

OMeGa国王抓住了三个在街上裸奔的人。虽然他们被看做是智障,这三个人坚持说只是一种行为艺术,然后乞求国王放了他们。出于对真正智障的仇恨,国王想测试一下他们是不是说谎了。这三个人被送到了国王的森林中,并且每个人都被要求依次捡一根树枝。如果他们带来的三根树枝能构成一个三角形,他们的数学能力就会解救他们。否则,他们就会蹲监狱……

然而,这三个确实是智障,并且他们会做的只是随机的选取树枝。当然他们不能捡相同的树枝(已经被取过的树枝)——但是与另一个相同长度的树枝是可以取得的。

给出森林里所有树枝的长度,计算他们获救的可能性。

输入 Input

输入的第一行会有一个整数T(T≤100),表示测试数据的组数;

每组数据以树枝数N(3≤N≤105)开始,下一行包含N个整数ai(1≤ai≤105),分别表示每个树枝的长度。

输出 Output

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

嗯构成三角形……需要满足的是两最小边之和大于第三边。

如果暴力的话是O(n3)的,过不去……

如果我们能搞出确定的两最小边之和有多少种方案,再拿第三边的方案数与其相乘不就好了?

嗯这种方法是O(n2)的还是过不去……

于是考虑构造一个单项式axb,其中a表示b长度的边的个数,那么a1a2xb1+b2中的a1a2就是我们想要的两最小边之和的方案数。

那么我们构造出来这样的一个多项式

∑i=1naixbi

对它平方,就可以在O(nlog2n)的时间搞出来所有我们想要的东西。

然后当然是要变化一下的。我们发现在统计中,可能出现一个边重复使用两次的情况,所以需要把它减去。又发现在统计中b1与b2边被重复计算了一次,所以得到的方案数应除以2。

然后就可以O(n)扫一遍第三边,把不合法的减去即可。

总时间复杂度为O(T(nlog2n+n))

Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: