zoukankan      html  css  js  c++  java
  • 自然数幂和的若干种解法

    差分法

    我们令 $S_t(n) = displaystyle sum_{k=0}^n k^t$,易得 $S_t(n) + (n+1)^t = displaystyle sum_{k=0}^n(k+1)^t$ ,可以用二项式定理化简为 $displaystyle sum_{k=0}^n sum_{i=0}^tinom{t}{i}k^i$,交换求和顺序得:

    $S_t(n)+(n+1)^t = displaystyle sum_{i=0}^tinom{t}{i}sum_{K=0}^nk^i = displaystyle sum_{i=0}^tinom{t}{i}S_i(n)$

    所以我们用$t+1$代替式子中的$t$就可以得到:

    $(n+1)^{t+1} = inom{t+1}{t}S_t(n)+ displaystyle sum_{i=0}^{t-1}inom{t+1}{i}S_i(n)$
    移项得到:

    $ S_t(n)  = frac{1}{t+1}((n+1)^{t+1} - displaystyle sum_{i=0}^{t-1}inom{t+1}{i}S_i(n))$

    然后我们就得到了一种递推求自然数幂和的方法,并且注意到这个递推式还帮我们证明了t次的自然数幂和是一个t+1次多项式。

    拉格朗日插值法

    由差分法,我们知道t次的自然数幂和是一个t+1次多项式,可以去t+2个点值队求出这个多项式。

    详见链接

    伯努利数法

    伯努利数原本就是处理等幂和的问题,可以推出

    $$ sum_{i=1}^{n}i^k={1over{k+1}}sum_{i=1}^{k+1}C_{k+1}^i*B_{k+1-i}*(n+1)^i $$

    因为

    $$sum_{k=0}^nC_{n+1}^kB_k=0(B_0=1)$$

    所以

    $$ B_n={- {1over{n+1}}}(C_{n+1}^0B_0+C_{n+1}^1B_1+……C_{n+1}^{n-1}B_{n-1})$$

    伯努利数的证明十分复杂,记住即可。

    详见 链接

    第一类Stirling数/第二类Stirling数

    详见 链接

    上面的这些做法,时间复杂度只与 $k$ 有关,还有一些算法涉及到 $n$,虽然不是很高效。

    BM递推

    我们知道 $k$ 次幂求和的是个 $k+1$ 次多项式,

    同样,设前n项和为 $S(n)$,容易发现 $S(n)$ 是关于前 $k+2$ 项的线性递推式。

    例如,$k=2$ 时,$S_n = 4S_{n-1} - 6S_{n-2} + 4S_{n-3} - S_{n-4}$

    所以求出前 $k+2$ 项和,放入BM中即可,时间复杂度为 $O(k^2logn)$

    详见 链接

    参考链接:

    1. https://zhuanlan.zhihu.com/p/31101275

    2. https://blog.csdn.net/werkeytom_ftd/article/details/50741165

  • 相关阅读:
    四则运算02
    第三周学习进度条
    《构建之法》阅读笔记1
    第二周学习进度条
    四则运算01
    第八周进度条
    每日站立会日07,08
    每日站立会议06
    每日站立会议05
    每日站立会议04
  • 原文地址:https://www.cnblogs.com/lfri/p/11189140.html
Copyright © 2011-2022 走看看