解法
首先要排序,然后容易分析得出对于任何i<ji<ji<j,宽度为Aj−AiA_j-A_iAj−Ai的子序列数量为2j−i−12^{j-i-1}2j−i−1。
AiA_iAi会出现在下标为0,1,2,…,i-1的二元组的右边,即需要乘以2i−12^{i-1}2i−1,2i−22^{i-2}2i−2,2i−32^{i-3}2i−3,…,202^020;
还会出现在下标为i+1,i+2,…,N-1的二元组的左边,即需要乘以−20-2^0−20,−21-2^1−21,−22-2^2−22,…,−2N−2−i-2^{N-2-i}−2N−2−i,所以加在一起是:
Ai(∑k=0i−12k−∑k=0N−2−i2k)=Ai(2i−2N−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