解法
首先要排序,然后容易分析得出对于任何
i
<
j
i<j
i<j,宽度为
A
j
−
A
i
A_j-A_i
Aj−Ai的子序列数量为
2
j
−
i
−
1
2^{j-i-1}
2j−i−1。
A
i
A_i
Ai会出现在下标为0,1,2,…,i-1的二元组的右边,即需要乘以
2
i
−
1
2^{i-1}
2i−1,
2
i
−
2
2^{i-2}
2i−2,
2
i
−
3
2^{i-3}
2i−3,…,
2
0
2^0
20;
还会出现在下标为i+1,i+2,…,N-1的二元组的左边,即需要乘以
−
2
0
-2^0
−20,
−
2
1
-2^1
−21,
−
2
2
-2^2
−22,…,
−
2
N
−
2
−
i
-2^{N-2-i}
−2N−2−i,所以加在一起是:
A
i
(
∑
k
=
0
i
−
1
2
k
−
∑
k
=
0
N
−
2
−
i
2
k
)
=
A
i
(
2
i
−
2
N
−
1
−
i
)
A_i(\sum_{k=0}^{i-1}2^k-\sum_{k=0}^{N-2-i}2^k)=A_i(2^i-2^{N-1-i})
Ai(k=0∑i−12k−k=0∑N−2−i2k)=Ai(2i−2N−1−i)
所以排序之后再扫描一遍就行了
class Solution(object):
def sumSubseqWidths(self, A):
"""
:type A: List[int]
:rtype: int
"""
MOD = 10**9+7
A.sort()
ans = 0
n = len(A)
pow2 = [1]
for i in xrange(1,n):
pow2.append((pow2[-1]<<1)%MOD)
for i in xrange(n):
j = n-1-i
if j<=i:break
ans += (A[j]-A[i])*((pow2[j]+MOD-pow2[i])%MOD)
ans = ans%MOD
return ans