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