【问题标题】:Sum of sum of i^k using matrix exponentiation使用矩阵求幂的 i^k 之和的总和
【发布时间】:2015-07-21 14:08:13
【问题描述】:

f(n) 定义为:f(n) = 1^k+2^k+3^k+...+n^k,所以是和 直到 n 的所有自然数的 k 次方。

在这个问题中你将要计算,

f(1) + f(2) + f(3) + ... + f(n)

1 ≤ n ≤ 123,456,789 和 0 ≤ k ≤ 321

(原问题链接:http://www.spoj.com/problems/ASUMHARD/Matrix)

一种幼稚的算法,逐个计算每个术语运行速度太慢,所以我想尝试解决递归关系。

天真的方法:

total = 0
for i = 1 to n:
    for j = 1 to i:
        total += j^k
return total

求幂可用于求解线性递归。 我知道如何解决线性重复,例如:

f(n) = f(n-k1) + f(n-k2) + ... + constant

但我找不到任何关于如何解决类似问题的信息

f(n) = f(n-k1) + f(n-k2) + ... + n^m 

f(n) = f(n-k1) + f(n-k2) + ... + n*m

f(n) = f(n-k1) + f(n-k2) + ... + k^n

即 涉及一个“n”项。

如何解决这样的递归,或者如何形成初始矩阵,其幂将用于解决递归?如果不使用矩阵求幂,至少有人可以描述一下如何处理它的想法吗?

【问题讨论】:

  • 这似乎更像是一道数学题,而不是一道编程题。
  • 你能发布你想要解决的确切重复吗?
  • 这似乎是一道数学题,而不是一道编程题。
  • 我也不明白,你为什么要对这个问题使用矩阵指数。
  • 这是一个关于 spoj 的编程问题。你能至少描述一下要接近的想法吗

标签: algorithm matrix recurrence


【解决方案1】:

为了解决你问题中linked的问题,我们可以使用一系列数学恒等式(S(p,k)Stirling Numbers of the Second Kind):

(1)

(2)

(3)

最后,利用身份,

我们得到:

(4)

Haskell 代码:

import Math.Combinat.Numbers

f n k
  | k == 0    = mod (div (n * (n + 1)) 2) 1234567891
  | otherwise = sum 
              $ map (\i -> stirling2nd k i 
                           * factorial i 
                           * binomial (n + 2) (i + 2) `mod` 1234567891) [1..k]

main = print (map (\(n,k) -> f n k) [(2,3),(10,3),(3,3),(100,0),(100,1),(123456789,321)])

输出:

*Main> main
[10,7942,46,5050,171700,193476340417]
(1.08 secs, 1374079760 bytes)

【讨论】:

  • 我无法评论您转换后的公式是否比简单的解决方案更有效,但是如果您的程序确实花费了超过 1 秒的时间来计算示例输入的解决方案,那么它比navie c++ 方法(在我的机器上,naive c++ 版本需要 1,3 milli 秒 - 但我没有 haskell 编译器来测试你的编译器)。您是否使用启用的编译器优化进行编译?顺便说一句:你知道,这个问题是用 c++ 标记的,而不是 haskell?
  • 第二,这可能是也可能不是对 spoj 问题的一个很好的答案,但不是对 OP 的问题(至少不是没有你编辑的原始问题)——至少我没有看到这里的任何矩阵。但考虑到这更像是一个XY-Problem,我认为这很好。
  • @MikeMB 感谢您的参与。您的 Naive c++ 版本是否在 1.3 毫秒内计算了 sum of f(1,321) + f(2,321)...+ f(123456789,321)?我不这么认为——那将是 7,620,789,436,823,655 次操作(我的操作是这样,这是我的示例输出中的最后一个条目)。而且我认为 OP 确实要求其他想法,至少我是这样解释他/她的评论的,“你至少可以描述要接近的想法。”
  • 我的错,我忘记了最后一个。
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2013-09-24
  • 2017-12-23
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2012-08-29
相关资源
最近更新 更多