• 自然数幂和


    首先我们从(n)个整数的平方和开始,也就是求

    [S(n)=sumlimits_{i=1}^ni^2 ]

    我们可以尝试对(S(n))进行扰动,就有

    [egin{align}S(n)&=sumlimits_{i=1}^n(i+1)^2-(n+1)^2+1 onumber\&=sumlimits_{i=1}^n(i^2+2i+1)-(n+1)^2+1 onumber\&=S(n)+2sumlimits_{i=1}^ni-n(n+1) onumberend{align} ]

    然后我们发现扰动失败了,(S(n))被消掉了,但是我们意外发现了求(sumlimits_{i=1}^ni)的公式

    于是我们猜测一下,是否可以用更高级的幂和(C(n)=sumlimits_{i=1}^ni^3)来求出(S(n))

    [egin{align}C(n)&=sumlimits_{i=1}^n(i+1)^3-(n+1)^3+1 onumber\&=sumlimits_{i=1}^n(i^3+3i^2+3i+1)-(n+1)^3+1 onumber\&=C(n)+3S(n)+dfrac{3n(n+1)}{2}-n(n+1)(n+2) onumber\Longrightarrow S(n)&=dfrac{n(n+1)(n+2)-frac{3n(n+1)}{2}}{3} onumber\&=dfrac{n(n+1)(2n+1)}{6} onumberend{align} ]

    于是这样我们得到了(S(n))的公式,既然如此,我们可以尝试着计算更高阶的幂和,我们设(S_k(n)=sumlimits_{i=1}^ni^k),那么有

    [egin{align}S_k(n)&=sumlimits_{i=1}^ni^k=sumlimits_{i=1}^n(i+1)^k-(n+1)^k+1 onumber\&=sumlimits_{i=1}^nsumlimits_{j=0}^kinom{k}{j}i^j-(n+1)^k+1 onumber\&=sumlimits_{j=0}^kinom{k}{j}S_j(n)-(n+1)^k+1 onumberend{align} ]

    这样就有

    [S_{k-1}(n)=dfrac{(n+1)^k-sumlimits_{j=0}^{k-2}inom{k}{j}S_j(n)-1}{k} ]

    或者可以写成

    [S_k(n)=dfrac{(n+1)^{k+1}-sumlimits_{j=0}^{k-1}inom{k+1}{j}S_j(n)-1}{k+1} ]

    那么我们就可以在(O(k^2))的时间内计算(S_k(n))


    其实我们可以在(O(k))的时间内求出(S_k(n)),具体可见浅谈算法——拉格朗日插值

  • 相关阅读:
    关于c语言的一个小bug(c专家编程)
    A10 平板开发一硬件平台搭建
    A10 平板开发二搭建Android开发环境
    hdu
    如何选择发现自己是否适合科研?
    屌丝程序员与房子
    一步一步学数据结构之n--n(Prim算法)
    pat 1049 Counting Ones
    add-strings
    这篇讲PHP的讲的有些道理 & mb_substr & 中文处理
  • 原文地址:https://www.cnblogs.com/Wolfycz/p/10622577.html
Copyright © 2020-2023  润新知