📌  相关文章
📜  给定数组的所有子集的多维数据集总和

📅  最后修改于: 2021-04-28 00:00:22             🧑  作者: Mango

给定数组arr [] ,任务是计算给定数组的所有可能的非空子集的多维数据集之和。因为答案可能很大,所以将值打印为mod 1000000007。

例子:

天真的方法:一种简单的方法是找到所有子集,然后对子集中的每个元素进行多维数据集处理并将其添加到结果中。该方法的时间复杂度将为O(2 N )

高效的方法:

  • 可以看出,原始数组的每个元素在所有子集中出现2(N – 1)次。
  • 因此,最终答案中任何元素arr i的贡献将是
    arri * 2(N – 1)
  • 因此,所有子集的多维数据集之和为
    [arr03 + arr13 + arr23 + … + arr(N-1)3] * 2(N – 1)
    

下面是上述方法的实现:

C++
// C++ implementation of the approach
  
#include 
using namespace std;
  
const int mod = 1e9 + 7;
  
// Function to return (2^P % mod)
long long power(int p)
{
    long long res = 1;
    for (int i = 1; i <= p; ++i) {
        res *= 2;
        res %= mod;
    }
    return res % mod;
}
  
// Function to return
// the sum of cubes of subsets
long long subset_cube_sum(vector& A)
{
  
    int n = (int)A.size();
  
    long long ans = 0;
  
    // cubing the elements
    // and adding it to ans
    for (int i : A) {
        ans += (1LL * i * i * i) % mod;
        ans %= mod;
    }
  
    return (1LL * ans * power(n - 1))
           % mod;
}
  
// Driver code
int main()
{
    vector A = { 1, 2 };
  
    cout << subset_cube_sum(A);
  
    return 0;
}


Python3
# Python3 implementation of the approach 
mod = int(1e9) + 7; 
  
# Function to return (2^P % mod) 
def power(p) :
  
    res = 1; 
    for i in range(1, p + 1) :
        res *= 2; 
        res %= mod; 
      
    return res % mod; 
  
# Function to return 
# the sum of cubes of subsets 
def subset_cube_sum(A) : 
  
    n = len(A); 
  
    ans = 0; 
  
    # cubing the elements 
    # and adding it to ans 
    for i in A :
        ans += (i * i * i) % mod; 
        ans %= mod; 
  
    return (ans * power(n - 1)) % mod; 
  
# Driver code 
if __name__ == "__main__" : 
  
    A = [ 1, 2 ]; 
  
    print(subset_cube_sum(A)); 
      
# This code is contributed by Yash_R


输出:
18

时间复杂度: O(N)