题目传送门
下面还是我的翻译
题目描述 Description
OMeGa国王抓住了三个在街上裸奔的人。虽然他们被看做是智障,这三个人坚持说只是一种行为艺术,然后乞求国王放了他们。出于对真正智障的仇恨,国王想测试一下他们是不是说谎了。这三个人被送到了国王的森林中,并且每个人都被要求依次捡一根树枝。如果他们带来的三根树枝能构成一个三角形,他们的数学能力就会解救他们。否则,他们就会蹲监狱……
然而,这三个确实是智障,并且他们会做的只是随机的选取树枝。当然他们不能捡相同的树枝(已经被取过的树枝)——但是与另一个相同长度的树枝是可以取得的。
给出森林里所有树枝的长度,计算他们获救的可能性。
输入 Input
输入的第一行会有一个整数 T ( T ≤ 100 ) T(T\le 100) T(T≤100),表示测试数据的组数;
每组数据以树枝数 N ( 3 ≤ N ≤ 1 0 5 ) N(3\le N\le 10^5) N(3≤N≤105)开始,下一行包含 N N N个整数 a i ( 1 ≤ a i ≤ 1 0 5 ) a_i(1\le a_i\le 10^5) ai(1≤ai≤105),分别表示每个树枝的长度。
输出 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=1∑naixbi
对它平方,就可以在
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