2

时间:2016-08-15 01:45:23

标签: c++ algorithm algebra

我正在尝试从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. {1}和2 ^ 1 = 2
  2.   
  3. {1}和2 ^ 1 = 2
  4.   
  5. {2}和2 ^ 2 = 4
  6.   
  7. {1,1}和2 ^ 2 = 4
  8.   
  9. {1,2}和2 ^ 3 = 8
  10.   
  11. {1,2}和2 ^ 3 = 8
  12.   
  13. {1,1,2}和2 ^ 4 = 16
  14.         

    所以总数将是44;

我对仅仅将指数加在一起的理解是错误的,因为答案远远大于第一个测试案例中的预期答案(显然)。

  

输入 422 412 417 497 284 输出 67920854

基本上,我希望有人解释提示。我想我只是在计算部分金额,但我不知道我想到mod 10^9 + 7的时间或内容。

仅供参考我只完成了代数II,所以如果我错过了一个数学概念,那么当你向我解释时,请记住我的经验。我一直在使用C ++编程,因此首选该语言的代码示例。

代码我对解决方案的可怜尝试:http://pastebin.com/c7YxCLMt

2 个答案:

答案 0 :(得分:3)

在没有看到你的尝试的情况下,很难说这可能是什么缺陷,但有两件事可能会成为陷阱:

  1. 你提到你应该mod 10^9 + 7,但要确保你做mod (10^9 + 7)
  2. 您正在计算的数字(2 ^ 497,2 ^ 284等)巨大并且肯定会溢出。如果您还没有处理此问题,您可以通过尝试他们正在做的事情here来改善您的尝试。
  3. 编辑:查看代码后,您似乎遇到了溢出问题。将您的想法here纳入您的解决方案中,您将受益匪浅。

答案 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])
相关问题