C ++中子序列宽度的总和

假设我们有一个整数数组A,请考虑A的所有非空子序列。对于任何序列S,都应将S的宽度视为S的最大元素与最小元素之差。我们必须找到A的宽度之和。 A的所有子序列。答案可能非常大,因此以10 ^ 9 + 7为模返回答案。

因此,如果输入类似于[3,1,2],则输出将为6,这是因为子序列类似于[1],[2],[3],[2,1],[2, 3],[1,3],[2,1,3]并且宽度为0、0、0、1、1、2、2,因此宽度值的总和为6。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个函数add(),这将需要a,b,

  • return((a mod m)+(b mod m))mod m

  • 定义一个函数sub(),这将需要a,b,

  • return((((a mod m)-(b mod m))+ m)mod m

  • 定义一个函数mul(),这将需要a,b,

  • return((a mod m)*(b mod m))mod m

  • 从主要方法中,执行以下操作-

  • 对数组进行排序

  • 回答:= 0

  • n:=一个的大小

  • rcnt:= 1

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • x = mul(a [i],sub(rcnt,1))

    • y = mul(a [n-1-i],sub(rcnt,1))

    • ans = add(ans,sub(x,y))

    • rcnt = rcnt * 2

    • rcnt:= rcnt mod m

  • 返回ans

让我们看下面的实现以更好地理解-

示例

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const lli m = 1e9 + 7;
class Solution {
   public:
   lli add(lli a, lli b){
      return ( (a % m) + (b % m) ) % m;
   }
   lli sub(lli a, lli b){
      return ( ( (a % m) - (b % m) ) + m ) % m;
   }
   lli mul(lli a, lli b){
      return ( (a % m) * (b % m) ) % m;
   }
   int sumSubseqWidths(vector<int>& a) {
      sort(a.begin(), a.end());
      int ans = 0;
      int n = a.size();
      lli rcnt = 1;
      for(int i = 0 ; i < n; i++){
         ans = add (ans, sub(mul(a[i] , sub(rcnt , 1)), mul(a[n-1-i], sub(rcnt,1))));
         rcnt <<=1;
         rcnt %= m;
      }
      return ans;
   }
};
main(){
   Solution ob;
   vector<int> v = {3,1,2};
   cout << (ob.sumSubseqWidths(v));
}

输入值

{3,1,2}

输出结果

6