思路:
题目要求枚举所有组合的可能,因此实际上和元素的位置是无关的。
从整体的角度来看,只要针对每一个max,考虑所有它可能的最小值即可。
排序过后,显然只有左侧元素,可以作为当前元素的最小值用于计算,而可能性就是 左侧元素到当前元素距离的2len,然后用动态规划记录一下每一个位置的答案,前一个位置和后一个位置就是多出了一个位置。
AC Code:
const int mod=1e9+7;
#define i64 long long
int qmi(int a,int b)
{
int res=1;
while(b)
{
if(b&1)res=(long long)res*a%mod;
a=(long long)a*a%mod;
b>>=1;
}
return res;
}
class Solution {
public:
int sumOfPower(vector<int>& nums) {
sort(nums.begin(),nums.end());
int ans=0;
vector<i64>dp((int)nums.size());
dp[0]=qmi(nums[0],3);
if(nums.size()>1)dp[1]=(i64)(nums[0]+nums[1])*((i64)nums[1]*nums[1]%mod)%mod;
ans=(dp[0])%mod;
if(nums.size()>1)ans=(ans+dp[1])%mod;
// cout<<0<<' '<<dp[0]<<endl;
for(int i=2;i<nums.size();i++)
{
dp[i]=(i64)((i64)(dp[i-1]*qmi(qmi(nums[i-1],2),mod-2)%mod-nums[i-1]+mod)%mod*2+nums[i-1]+nums[i])%mod*qmi(nums[i],2)%mod;
// cout<<i<<' '<<dp[i]<<endl;
ans=(ans+dp[i])%mod;
}
return ans;
}
};
//1 2 4
//(1+1*2^0*4+4+(1*2*16)+(2*1*16)+16)
//(1+8+4+32+32+16+4^3+2^3+1)=93+64+8+1=93+73=
//(1*2)*16+(2)*16+4*16