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

    定义与约定

    [Large S_k(n)=sum_{i=0}^{n-1}i^k ]

    注意是一直加到 ((n-1)^k),不是 (n^k)

    忽略了部分下取整符号。

    扰动法

    [S_k(n)=sum_{i=0}^{n-1}i^k ]

    [=sum_{i=0}^{n-1}(i+1)^k - n^k ]

    [=sum_{i=0}^{n-1} sum_{d=0}^k{k choose d}i^d - n^k ]

    [=sum_{d=0}^k {k choose d}sum_{i=0}^{n-1}i^d - n^k ]

    [= sum_{d=0}^k {k choose d}S_d(n)-n^k ]

    [= S_k(n) + kS_{k-1}(n) - n^k + sum_{d = 0}^{k-2}{k choose d}S_d(n) ]

    移项:

    [S_{k-1}(n)=1/k*(n^k-sum_{d=0}^{k-2}{k choose d}S_d(n)) ]

    [S_k(n)=frac{n^{k+1}-sum_{d=0}^{k-1}{k+1 choose d}S_d(n)}{k+1} ]

    复杂度:(O(k^2))

    优化:

    [S_k(n)=frac{n^{k+1}}{k+1}-k!sum_{d=0}^{k+1}frac{S_d(n)}{d!}(k+1-d)! ]

    分治FFT可以做到 (O(klog^2k))

    拉格朗日插值

    根据常识,(S_k(n)) 是关于 (n)(k+1) 次多项式。于是可以用拉格朗日插值搞。

    [large f(x)=sum_{i=1}^{k+2} y_iprod_{j le k+2,j ot= i}frac{x-x_i}{x_j-x_i} ]

    发现后面那个的 (x_i) 是连续的,于是可以预处理前缀后缀积加速。复杂度:(O(k))

    伯努利数

    考虑我们把这 (k+1) 次多项式精确地表示出来。这需要用伯努利数

    [Large S_k(n)=frac{1}{k+1} * sum_{i = 0}^{k} {k+1 choose i}B_in^{k-i+1} ]

    直接预处理伯努利数后直接插值即可。

    复杂度:(O(k^2+qk))

    优化:可以用多项式求逆预处理伯努利数,复杂度 (O(klogk+qk))

    第二类斯特林数

    根据组合意义:

    [Large n^m=sum_{i} egin{Bmatrix} m \ i end{Bmatrix} {n choose i}i! ]

    于是:

    [S_k(n)=sum_{i=0}^{n-1}i^k ]

    [=sum_{i=0}^{n-1}sum_{j}egin{Bmatrix} k \ j end{Bmatrix} {i choose j}j!]

    [=sum_{j=0}^{k} egin{Bmatrix} k \ j end{Bmatrix} j! sum_{i=0}^{n-1}{i choose j}]

    [=sum_{j=0}^k egin{Bmatrix} k \ j end{Bmatrix}j! {n choose j + 1} ]

    然后就可以 (O(k)) 算了。

    第一类斯特林数

    众所周知,斯特林数擅长普通幂和上升幂/下降幂的转换,而上升幂/下降幂擅长处理类似“前缀和”的问题。所以我们可以尝试用斯特林数来解决自然数幂和问题。

    根据组合意义:

    [Large x^{overline{n}}=sum_{i=0}^n egin{bmatrix} n\ i end{bmatrix} x^i ]

    这个组合意义是:枚举每种将 (n) 分成若干种轮换的方式,并将每个轮换染成 (1...x) 的颜色的方案数,等价于一个一个地加点,每个点既可以选择新建一个轮换,有 (x) 种方案;又可以选择跟在之前的点的后面,方案是 (0...n-1)

    感觉不够严谨?我们尝试用数学归纳法证明一下:

    [egin{aligned} x^{overline{n-1}}&=sum_{i=0}^{n-1} egin{bmatrix} n-1 \ i end{bmatrix}x^i \ (n+x-1)x^{overline{n-1}}&= sum_{i=0}^{n}(n-1)egin{bmatrix} n-1 \ i end{bmatrix}x^i+sum_{i=0}^negin{bmatrix} n-1 \ i end{bmatrix}x^i \ x^{overline{n}} &= sum_{i=0}^negin{bmatrix} n \ i end{bmatrix}x^i end{aligned} ]

    现在我们回到自然数幂和的问题。

    [egin{aligned} S_k(n)&=sum_{i=0}^{n-1}i^k\ &= sum_{i=0}^{n-1}i^{overline{k}}-sum_{j=0}^{k-1} egin{bmatrix} k \ j end{bmatrix}i^j\ &= k!sum_{i=0}^{n-1}{i + k - 1 choose k}-sum_{i=0}^{n-1}sum_{j=0}^{k-1} egin{bmatrix} k \ j end{bmatrix}i^j\ &= k! {k + n- 1 choose k + 1}-sum_{j=0}^{k-1}egin{bmatrix} k \ j end{bmatrix}S_j(n)\ &= frac{(n-1)^{overline{k+1}}}{k+1}-sum_{j=0}^{k-1}egin{bmatrix} k \ j end{bmatrix}S_j(n) end{aligned} ]

    直接递推即可。复杂度:(O(k^2))。优势在于模数无需为质数

    不喜欢上升幂?我们试一试下降幂:

    首先应该知道:

    [Large x^{overline{n}}=(-1)^n(-x)^{underline{n}} ]

    [Large x^{underline{n}}=(-1)^n(-x)^{overline{n}} ]

    (显然)

    然后代入$x{overline{n}}=sum_{i=0}n egin{bmatrix}
    n
    i
    end{bmatrix} x^i $,硬把它搞成下降幂:

    [(-1)^n(-x)^{underline{n}}=sum_{i=0}^n egin{bmatrix} n\ i end{bmatrix} x^i ]

    (-x) 代替 (x)

    [Large x^{underline{n}}=sum_{i=0}^n egin{bmatrix} n\ i end{bmatrix} (-1)^{n-i}x^i]

    用这个搞一搞:

    [egin{aligned} S_k(n)&=sum_{i=0}^{n-1}i^k\ &=sum_{i=0}^{n-1}i^{underline{k}}-sum_{j=0}^{k-1}egin{bmatrix} k\ j end{bmatrix}(-1)^{k-j}i^j\ &= k!sum_{i=0}^{n-1}{i choose k}-sum_{j=0}^{k-1}egin{bmatrix} k\ j end{bmatrix}(-1)^{k-j}sum_{i=0}^{n-1}i^j\ &= k!{n choose k + 1}-sum_{j=0}^{k-1}egin{bmatrix} k\ j end{bmatrix}(-1)^{k-j}S_j(n)\ &= frac{n^{underline{k+1}}}{k+1}-sum_{j=0}^{k-1}egin{bmatrix} k\ j end{bmatrix}(-1)^{k-j}S_j(n)\ end{aligned} ]

    同样直接递推即可。复杂度同样是 (O(k^2))。优势同样在于模数无需为质数

  • 相关阅读:
    [硬件]_ELVE_VS2015下opencv3.3的配置问题
    [Linux]_ELVE_ssh登录远程阿里服务器
    [python]_ELVE_pip2和pip3如何共存
    U盘无法打开提示格式化?如何进行恢复
    [转]pycharm的一些快捷键
    文件上传Django
    ansible编译安装--操作系统环境Redhat6.4
    django的models字段介绍
    paramiko模块
    mysql安装等操作
  • 原文地址:https://www.cnblogs.com/JiaZP/p/13554017.html
Copyright © 2011-2022 走看看