zoukankan      html  css  js  c++  java
  • 自然数幂和

    首先我们从(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)),具体可见浅谈算法——拉格朗日插值

  • 相关阅读:
    Java 高阶 —— try/catch
    Java 高阶 —— native 关键字与 JNI
    python库学习笔记——分组计算利器:pandas中的groupby技术
    编程模式(schema) —— 表驱动法(table-driven)
    python中元组tuple
    .Net Framwork类库
    SMB带宽限制
    WindDbug应用
    Python学习笔记
    Python递归遍历目录下所有文件
  • 原文地址:https://www.cnblogs.com/Wolfycz/p/10622577.html
Copyright © 2011-2022 走看看