Algorithm 所有i的2^Pi mod 100000007之和,其中Pi是集合X的第i个子集中的数字之和

Algorithm 所有i的2^Pi mod 100000007之和,其中Pi是集合X的第i个子集中的数字之和,algorithm,set,Algorithm,Set,我遇到了一个问题,我必须为所有I打印2Pi mod 100000007的和,其中Pi是Ith子集中的数字之和集X 集合的长度可以达到100000 范围[01012]内元素的值 这是问题的联系。 我找不到任何方法,除了暴力,这给了我更多的机会 这是问题陈述 奥拉夫伯爵给了维奥莱特、克劳斯和桑尼·波德莱尔一项任务,让他们在获得财富的同时保持忙碌。他给了他们N个号码,并要求他们每个人做以下事情: 他要求Sunny生成这组数字的所有可能子集。 然后,他要求克劳斯找出这样形成的每个子集中的数字之和。 最

我遇到了一个问题,我必须为所有I打印2Pi mod 100000007的和,其中PiIth子集中的数字之和集X

集合的长度可以达到100000

范围[01012]内元素的值

这是问题的联系。

我找不到任何方法,除了暴力,这给了我更多的机会

这是问题陈述

奥拉夫伯爵给了维奥莱特、克劳斯和桑尼·波德莱尔一项任务,让他们在获得财富的同时保持忙碌。他给了他们N个号码,并要求他们每个人做以下事情:

他要求Sunny生成这组数字的所有可能子集。 然后,他要求克劳斯找出这样形成的每个子集中的数字之和。 最后,他让维奥莱特告诉他所有i的2Pi之和,其中Pi是第i个子集中的数字之和

由于奥拉夫伯爵听这么长的电话会感到无聊,他要求给他答案

你能帮助波德莱尔走出困境吗

输入格式

输入的第一行包含一个表示集合大小的数字N。下一行将包含构成集合的N个数字

输出格式

把答案打印成一行

输入约束

一,≤ N≤ 105

0≤ a[i]≤ 1012

以下是我的解决方案:

import itertools # importing module

#initializing the sum variable which will store final answer
t=0

#Input, number of elements in array
n=input()

#Input the array
arr=map(int,raw_input().split())

#Traverse all the possible combinations and update the sum variable 't'.
for i in xrange(len(arr)+1):
    for val in itertools.combinations(arr,i):
        x=sum(val)

        t=(t+2**x)%1000000007
#Print final answer
print t
这是一个在时间限制内通过所有测试用例的工作算法,但我不明白它背后的逻辑

from sys import stdin
mod = 10**9 + 7
n = int(stdin.readline())
ans = 1
a = map(int,stdin.readline().split())
for i in a:
    j = pow(2,i,mod)
    ans = (ans*(j+1))%mod
print ans
@版主、管理员等。 在将此问题搁置或标记主题或结束之前。。。。 请评论原因,以便我知道原因,如果可能的话,请重写或在任何其他StackExchange网站上询问。 我首先把它发布在codegolf.stackexchange.com上,那里的人(版主)建议我把它发布在这里,因为它属于算法类

你可以在这里读到


谢谢

我们给了你一组数字
X
,并要求你计算
总和(2^sum(X表示a中的X)表示X的子集)

X
为集
{X[0],X[1],…,X[n]}
S[i]
X[0]…X[i]
的子集之和的2的幂之和。也就是说,
S[i]=sum(对于x[0]…x[i])的一个子集,2^sum(x代表A中的x))

x[0]…x[i+1]
的子集可以是
x[0]…x[i]
的子集,也可以是添加了
x[i+1]
x[0]…x[i]
的子集

然后:

这为我们提供了计算结果的线性时间方法:

A = [3, 3, 6, 1, 2]
m = 10**9 + 7
r = 1
for x in A:
    r = (r * (1 + pow(2, x, m))) % m
print r

给您一组数字
X
,并要求您计算
sum(2^sum(X表示a中的X)表示X的子集)

X
为集
{X[0],X[1],…,X[n]}
S[i]
X[0]…X[i]
的子集之和的2的幂之和。也就是说,
S[i]=sum(对于x[0]…x[i])的一个子集,2^sum(x代表A中的x))

x[0]…x[i+1]
的子集可以是
x[0]…x[i]
的子集,也可以是添加了
x[i+1]
x[0]…x[i]
的子集

然后:

这为我们提供了计算结果的线性时间方法:

A = [3, 3, 6, 1, 2]
m = 10**9 + 7
r = 1
for x in A:
    r = (r * (1 + pow(2, x, m))) % m
print r

另外,向我们展示您已经拥有的内容。交叉发布:。请每个社区都应该诚实地回答问题,而不会浪费任何人的时间。@D.W.好吧,但没有必要对一个可能对每个人都有用的问题投反对票。我得到了我的答案,并且已经从中受益。如果你不必要地投反对票,然后其他人可能无法获得洞察力。在按下该按钮之前请思考。另外,不同站点(SO和CS)的人有不同的观点。这里的人可能更关心提出解决方案、代码等。但是CS的人更关心运行时分析、涉及的数学、证明等。我不是在批评或侮辱任何人,我只是告诉大家普遍的共识。而且,向我们展示您已经拥有的内容。交叉发布:。请每个社区都应该诚实地回答问题,而不会浪费任何人的时间。@D.W.好吧,但没有必要对一个可能对每个人都有用的问题投反对票。我得到了我的答案,并且已经从中受益。如果你不必要地投反对票,然后其他人可能无法获得洞察力。在按下该按钮之前请思考。另外,不同站点(SO和CS)的人有不同的观点。这里的人可能更关心提出解决方案、代码等。但CS的人更关心运行时分析、涉及的数学、证明等。我绝不批评或侮辱任何人,我只是告诉大家普遍的共识。你能告诉我思考的过程吗,我是说你是如何得出这个解决方案的。我被困了将近2个月,仍然无法解决它。我寻找一个动态规划解决方案,并遵循2^(a+b+c…)=2^a*2^b*2^c的想法。见Rick Decker的答案,另一种描述同样方法的方式。我真的非常感谢你的回答,我只是想让你看看,因为我认为这可能在某种程度上对你有所帮助。你能告诉我思考的过程吗,我是说你是如何找到这个解决方案的。我被困了将近2个月,仍然无法解决它。我寻找一个动态规划解决方案,并遵循2^(a+b+c…)=2^a*2^b*2^c的想法。见Rick Decker的回答,另一种描述同样方法的方式。我真的非常感谢你的回答,我只是想让你看看,因为我认为这可能在某种程度上对你有所帮助。