我正在尝试从hackerrank.com
完成编码挑战Shashank是数学的新手,他知道给定的基数N具有(2 N - 1)非空子列表后,他非常兴奋。他写下了给定集A的所有非空子列表。对于每个子列表,他计算sublist_sum,它是元素的总和,并用S 1 表示它们,S 2 ,S 3 ,...,S (2 N -1)。 然后他定义了一个special_sum,P。P = 2 S 1 + 2 S 2 + 2 S 3 .... + 2 S (2 N -1) 并报告P%(10 ^ 9 + 7)。
OUPUT 打印special_sum,P modulo(10 ^ 9 + 7)。
我几乎可以肯定我误解了提示,但我的程序是为了收到一个数字列表。该程序将使该列表的所有组合的功能提高2(没有重复,顺序无关紧要,所有大小),然后将它们加在一起并打印出来。
网站上的例子是
列表
1, 1, 2
输出44
解释
- {1}和2 ^ 1 = 2
- {1}和2 ^ 1 = 2
- {2}和2 ^ 2 = 4
- {1,1}和2 ^ 2 = 4
- {1,2}和2 ^ 3 = 8
- {1,2}和2 ^ 3 = 8
- {1,1,2}和2 ^ 4 = 16
醇>所以总数将是44;
我对仅仅将指数加在一起的理解是错误的,因为答案远远大于第一个测试案例中的预期答案(显然)。
输入
422 412 417 497 284
输出 67920854
基本上,我希望有人解释提示。我想我只是在计算部分金额,但我不知道我想到mod 10^9 + 7
的时间或内容。
仅供参考我只完成了代数II,所以如果我错过了一个数学概念,那么当你向我解释时,请记住我的经验。我一直在使用C ++编程,因此首选该语言的代码示例。
代码我对解决方案的可怜尝试:http://pastebin.com/c7YxCLMt
答案 0 :(得分:3)
在没有看到你的尝试的情况下,很难说这可能是什么缺陷,但有两件事可能会成为陷阱:
答案 1 :(得分:2)
问题基本上是:给定一个数字列表,找到一个或多个元素的所有可能产品的总和,其中列表不是您给出的列表,而是两个那些幂。例如,您的示例是{2,2,4}中的一个或多个的乘积之和。
我们可以通过查看0个或更多元素的乘积之和,然后减去我们不想要的空产品的1来进一步简化。这可以让你使用一个巧妙的技巧:对于列表中的每个元素,你将乘以1或数字。所以对于列表{2,2,4},总和是(2 + 1)(2 + 1)(4 + 1)= 3 * 3 * 5 = 45,给出45-1 = 44作为答案。
以下是PARI / GP中的一些工作代码。
specialSum(v, m=10^9+7)=lift(factorback(apply(n -> Mod(2,m)^n+1, v))-1)
用法:
specialSum([1,1,2])
specialSum([422,412,417,497,284])