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

    伯努利数

    伯努利数是一个这样的数列:({1,-frac{1}{2},frac{1}{6},0,-frac{1}{30},0,frac{1}{42},0,-frac{1}{30},0,dots})

    (所有大于(2)的奇数项都是(0))

    满足:

    [egin{aligned} sum_{k=0}^n inom{n+1}{k} B_k = 0 quad (n>0) end{aligned} ]

    换个方式写:

    [egin{aligned} sum_{k=0}^n inom{n}{k} B_k &= B_n quad (n eq 1) end{aligned} ]

    观察上面的式子, 我们可以将({B_i})的EGF和({1,1,1,dots})的EGF乘起来, 得到:

    [egin{aligned} B(x) e^x &= B(x) + x \ B(x) &= frac{x}{e^x - 1} end{aligned} ]

    (左边加的(x)是特殊处理(n eq 1)的限制)

    所以我们就可以用多项式求逆在(O(nlog n))的时间内求出(B_1dots B_n)了.

    (S_m(n) = sum_{i=0}^{n-1} i^m), 那么有:

    [S_m(n) = frac{1}{m+1} sum_{k=0}^m inom{m+1}{k}B_k n^{m+1-k} ]


    递推

    ((i+1)^{k+1}-i^{k+1}=sumlimits_{j=0}^kinom{k+1}{j}i^j)累加得:

    [egin{align*} (n+1)^{k+1}-1&=sum_{i=1}^nsum_{j=0}^k inom{k+1}{j}i^j\ &=sum_{j=0}^kinom{k+1}{j}sum_{i=1}^n i^j end{align*} ]

    (sumlimits_{i=1}^{n}i^k)拿出来:

    [egin{align*} sum_{i=1}^n i^k &= frac{(n+1)^{k+1}-1-sum_{j=0}^{k-1}inom{k+1}{j}sum_{i=1}^n i ^ j}{inom{k+1}{k}}\ &= frac{(n+1)^{k+1}-1-sum_{j=0}^{k-1}inom{k+1}{j}color{red}{sum_{i=1}^n i ^j}}{k+1} end{align*} ]

    直接递推即可。


    差分

    我们记一个序列的(k)次差分后的序列为(Delta_k)

    任何(k)次多项式的点值经过(k+1)次差分后都会变成全为(0)的序列,即(Delta_k)均为(0)

    我们对(f(n)=n^k)进行差分,设(c_k)为第(0)条对角线的第(k)项,那么有(f(n)=sumlimits_{i=0}^k c_i inom{n}{i})
    所以:

    [egin{align*} sum_{i=0}^n f(i) &= sum_{i=0}^nsum_{j=0}^{k} c_j inom{i}{j}\ &= sum_{j=0}^k c_j sum_{i=0}^n inom{i}{j}\ &= sum_{j=0}^k c_j inom{n+1}{j+1} end{align*} ]

    关于最后那个组合数的推导(sum_{i=0}^n inom{i}{j}=inom{n+1}{j+1}),可以理解为:有(j+1)个球和(n+1)个盒子,枚举最后一个球放的位置(i+1),剩下的球放置的方案就是(inom{i}{j})


    拉格朗日插值

    可以证明(sumlimits_{i=0}^n i^k)是一个(k+1)次多项式,因此我们可以用插值来做。
    先求出(x=0dots k+1)的点值,然后将(n)带入即可。
    时间复杂度是(O(klog k))

    简便实现:
    设多项式为(sum_{i=0}^{k+1}coef_i(x) x^i),根据拉格朗日插值的那个式子得到:

    [coef_{p+1}(x)=coef_p(x) imes frac{(x-p)(p-k)}{(x-p-1)(p+1)} ]

    直接将得到的系数乘点值即可。

    如果要做到(O(k)),线性筛得到(x^k)即可(瓶颈在于快速幂, 质数个数的级别是(frac{k}{log k})的, 只对质数做快速幂, 时间复杂度就是(O(k))的了)。


    斯特林数

    [egin{aligned} inom{n}{k} = frac{n^{underline{k}}}{k!} = frac{sumlimits_{i = 0}^{k} left[egin{matrix} k \ i end{matrix} ight] (-1)^{k - i} n^i}{k!} \ k! inom{n}{k} = sum_{i = 0}^{k} left[egin{matrix} k \ i end{matrix} ight] (-1)^{k - i} n^i \ \ n^k = k! inom{n}{k} - sum_{i = 0}^{color{red}{k - 1}} left[egin{matrix} k \ i end{matrix} ight] (-1)^{k - i} n^i end{aligned}]

    那么

    [egin{aligned} sum_{i = 0}^{n} i^k &= sum_{i = 0}^{n} left( k! inom{i}{k} - sum_{j = 0}^{k - 1} left[egin{matrix} k \ j end{matrix} ight] (-1)^{k - j} i^j ight) \ &= k! sum_{i = 0}^{n} inom{i}{k} - sum_{i = 0}^{n} sum_{j = 0}^{k - 1} left[egin{matrix} k \ j end{matrix} ight] (-1)^{k - j} i^j \ &= k! inom{n + 1}{k + 1} - sum_{j = 0}^{k - 1} left[egin{matrix} k \ j end{matrix} ight] (-1)^{k - j} color{red}{sum_{i = 0}^{n} i^j} \ &= frac{(n + 1)^{underline{k + 1}}}{k + 1} - sum_{j = 0}^{k - 1} left[egin{matrix} k \ j end{matrix} ight] (-1)^{k - j} color{red}{sum_{i = 0}^{n} i^j} end{aligned} ]

    至于(displaystylefrac{1}{k+1}),一定可以在((n+1)^{underline{k+1}})中除去。

    所以直接(O(k^2))预处理出第一类斯特林数即可。

  • 相关阅读:
    Java中关于String类型的10个问题
    关于Linux中后台运行程序(&)退出时收不到SIGHUP信号的说明
    《Javascript DOM编程艺术》学习笔记 第8章 充实文档的内容
    《Javascript DOM编程艺术》学习笔记 第7章 动态创建标记
    《Javascript DOM编程艺术》学习笔记 第1-6章
    golang: 读取已关闭的缓冲型channel的表现
    关于《汇编语言(王爽)》程序6.3使用16个dw 0的问题
    关于寄存器的一些笔记
    img格式镜像转ISO格式
    深入理解计算机操作系统:第1章 计算机系统漫游(学习笔记)
  • 原文地址:https://www.cnblogs.com/Hany01/p/powersum.html
Copyright © 2011-2022 走看看