zoukankan      html  css  js  c++  java
  • 伯努利数

    正整数幂与伯努利数

    十分神仙。

    考虑正整数幂:

    [sum_{i=1}^n i^k ]

    假设我们给定了 (n) 被要求求解 (k={1,2,3...10^5}) 时的答案,怎么办( (n) 非常大 )。

    考虑一个构造,我们构造 (mathbf{EGF}) 来计算答案,设 (S_k(n)=sum_{i=1}^n i^k),我们构造 (mathbf{EGF}) 为:

    [G_n(x)=sum_{i=0}^n S_i(n)frac{x^i}{i!} ]

    容易注意到:

    [egin{aligned} &G_n(x)=sum_{i=0}^n sum_{j=1}^n j^i frac{x^i}{i!} \&=sum_{j=1}^n sum_{i=0}^n j^ifrac{x^i}{i!} \&=sum_{j=1}^n e^{jx} end{aligned}]

    然后考虑

    [egin{aligned} &(1-e^{-x})G_n(x)=sum_{j=1}^n e^{jx}-sum_{j=0}^{n-1}e^{jx} \&implies (1-e^{-x})G_n(x)=e^{nx}-1 \&implies G_n(x)=frac{e^{nx}-1}{1-e^{-x}} end{aligned}]

    那么直接展开分子,然后求个分母的逆即可,复杂度 (mathcal O(klog k))


    对于某个具体的 (k) 考虑快速的求解此多项式:

    考虑构造,假设能够将 (G_n(x)) 表示为两个多项式的卷积,同时其中一个恰好为以 (n) 的次幂为系数的多项式,那么我们容易得到系数即卷积结果,换而言之得到其多项式表达式。

    事实上,我们注意到:

    [egin{aligned} &G_n(x)=frac{e^{nx}-1}{1-e^{-x}} \&implies G_n(x)=frac{e^{(n+1)x}-e^x}{e^x-1} \&implies G_n(x)=igg(frac{xe^x}{e^x-1}igg)cdot igg(frac{e^{nx}-1}{x}igg) end{aligned}]

    注意到后者本质是 (mathbf{EGF}{frac{n}{1},frac{n^2}{2},frac{n^3}{3}...frac{n^{i+1}}{i+1}}),请注意描述 (mathbf{EGF}) 系数序列时默认除以 (i!)

    然后考虑 (frac{xe^x}{e^x-1}) 的展开式,我们认为其展开式的对应级数为 (mathbf{EGF}{B_0,B_1...})

    所以我们得到:

    [egin{aligned} &S_k(n)=sum_{i+j=k} inom{k}{i}B_ifrac{n^{j+1}}{j+1} \&=sum_{i=0}^k B_ifrac{k!}{i!(k-i)!}frac{n^{k-i+1}}{k-i+1} \&=frac{1}{k+1}sum_{i=0}^k B_i frac{(k+1)!}{i!(k-i+1)!}n^{k-i+1} \&=frac{1}{k+1}sum_{i=0}^k B_iinom{k+1}{i}n^{k-i+1} end{aligned}]

    这样就得到了 (sum_{i=0}^n i^k) 这个关于 (n) 的多项式 (S_k(n)) 的通式了。


    如何求解伯努利数

    注意到伯努利数本质上是 (frac{xe^x}{e^x-1}) 的展开式,所以求逆即可。

    如何优雅的暴力

    注意到:

    [frac{xe^x}{e^x-1} imes frac{e^{x}-1}{x}=e^x ]

    所以 (mathbf{EGF}{B_0,B_1...} imes mathbf{EGF}{frac{1}{1},frac{1}{2},frac{1}{3}...}=mathbf{EGF}{1,1,1...})

    所以我们有:

    [egin{aligned} &sum_{i+j=k} B_i imes frac{1}{j+1} imes inom{k}{i}=1 \& sum_{i}^k B_i imesinom{k+1}{i}=k+1 end{aligned}]

    (B_0=1) 为边界,我们可以依次递推得到 (B_i),复杂度 (mathcal O(k^2))


    例题:

    给定 (n) 个数 (a_{1sim n}) 以及常数 (k),求:

    [sum_{i=1}^n sum_{j=1}^{a_i} j^k ]

    ( m Sol:)

    后者考虑通过伯努利数求得其展开多项式,我们所求变为:

    [egin{aligned} &sum_{i=1}^n sum_{j=0}^{k+1} f_j imes a_i^j \&= sum_{j=0}^{k+1} f_jsum_{i=1}^n a_i^j end{aligned}]

    于是只需要求后者。

    考虑构造多项式 (F_i(x)=sum_{j=0}^{infty} a_i^j x^j)

    那么所求即 (sum F_i(x)) 的系数序列,设为 (G(x))

    注意到 (F_i(x)) 显然可以收敛为 (frac{1}{1-a_ix}),那么所求即:

    [frac{sum_i sum_{j e i} (1-a_jx)}{prod (1-a_ix)} ]

    下面可以分治 NTT 处理,上面可以考虑组合意义,注意到下面计算式的 ([x^k]) 处系数等价于从 (n) 个括号中选出 (k)(-a_ix) 的权值和,那么分子即选出 (k) 个后再从剩余的元素中删去一个方案数,所以有 (f_i'=f_i imes (n-i))

    然后直接计算答案即可,复杂度 (mathcal O(nlog^2 n+klog k))

  • 相关阅读:
    铬族元素
    Linux下安装虚拟环境
    Flask之路由系统
    Flask之CSRF
    【原创】关于Azure Storage Simulator 不能启动的问题
    今天终于搞清楚了正则表达式
    模型权重的保存与加载 回调函数的使用
    卷积神经网络结构
    滑动窗口与R-CNN
    模型权重记录与恢复
  • 原文地址:https://www.cnblogs.com/Soulist/p/13658922.html
Copyright © 2011-2022 走看看