给定一个数组arr[] ,任务是计算给定数组的所有可能的非空子集的立方体总和。由于答案可能很大,请将值打印为mod 1000000007。
例子:
Input: arr[] = {1, 2}
Output: 18
subset({1}) = 13 = 1
subsetval({2}) = 23 = 8
subset({1, 2}) = 13 + 23 = 1 + 8 = 9
Sum of cubes of all Subsets = 1 + 8 + 9 = 18
Input: arr[] = {1, 1, 1}
Output: 12
朴素的方法:一种简单的方法是找到所有子集,然后将该子集中的每个元素立方并将其添加到结果中。这种方法的时间复杂度为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)