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的编程问题。如果不使用矩阵求幂,至少可以描述一个想法来接近吗?
答案 0 :(得分:0)
要解决问题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)