使用矩阵求幂的i ^ k之和的和

时间:2015-07-21 14:08:14

标签: c++ algorithm matrix linear recurrence

f(n) is defined as: f(n) = 1^k+2^k+3^k+...+n^k, so it is the sum
of the k-th power of all natural numbers up to n.

In this problem you are about to compute,

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

1 ≤ n ≤ 123,456,789 and 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的编程问题。如果不使用矩阵求幂,至少可以描述一个想法来接近吗?

1 个答案:

答案 0 :(得分:0)

要解决问题linked中的问题,我们可以使用一系列数学身份(S(p,k)Stirling Numbers of the Second Kind):

(1)

enter image description here

(2)

enter image description here

(3)

enter image description here

最后,利用身份,

enter image description here

我们得到:

(4)

enter image description here

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)