自然数幂和 拉格朗日插值法和第二类斯特林数法

2024-05-29 02:48

本文主要是介绍自然数幂和 拉格朗日插值法和第二类斯特林数法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在这里,目的是在以后需要看的时候不用再去网上抄(划掉)
求 s ( n ) = ∑ i = 1 n i k 求s(n)=\sum_{i=1}^n i^k s(n)=i=1nik

拉格朗日插值法

给定若干个点值,(x0,y0),(x1,y1),(xn,yn),它们的差值多项式
L ( x ) = ∑ i = 0 n y i ∗ ∏ j ≠ i x − x j x i − x j L(x)=\sum_{i=0}^nyi*\prod_{j\neq i}{x-xj\over xi-xj} L(x)=i=0nyij̸=ixixjxxj
听说自然数幂和可以表示为k+1次多项式函数。
求自然数幂和的时候,就直接取点值为(0,s(0)),(1,s(1)),(k+1,s(k+1))
于是
L ( n ) = ∑ i = 0 k + 1 s ( i ) ∗ ∏ j ≠ i n − j i − j L(n)=\sum_{i=0}^{k+1}s(i)*\prod_{j\neq i}{n-j\over i-j} L(n)=i=0k+1s(i)j̸=iijnj
L ( n ) = ∑ i = 0 k + 1 s ( i ) ∗ ( − 1 ) k + 1 − i n ( n − 1 ) . . . ( n − i + 1 ) ( n − i − 1 ) . . . ( n − k − 1 ) i ! ( k + 1 − i ) ! L(n)=\sum_{i=0}^{k+1}s(i)*(-1)^{k+1-i}{n(n-1)...(n-i+1)(n-i-1)...(n-k-1)\over i!(k+1-i)!} L(n)=i=0k+1s(i)(1)k+1ii!(k+1i)!n(n1)...(ni+1)(ni1)...(nk1)
预处理k以内的自然数幂和,求个逆元就好了。
复杂度 O ( k ) O(k) O(k)

第二类斯特林数法

但是如果不能求逆元
有第二类斯特林数 { n k } \left\{ ^k_n \right\} {nk}为将k个无区别的球放入n个有区别的非空盒子的方案数
所以 k 2 k^2 k2转移显然:
{ n k } = { n − 1 k − 1 } + n { n k − 1 } \left\{ ^k_n \right\}=\left\{ ^{k-1}_{n-1} \right\}+n\left\{ ^{k-1}_{ n} \right\} {nk}={n1k1}+n{nk1}
已知 n k = ∑ i = 0 k { i k } ∗ n i ‾ n^k=\sum_{i=0}^k \left\{ ^k_i \right\}*n^{\underline i} nk=i=0k{ik}ni
可以用组合意义理解:
左边是k个无区别的球随意放入n个有区别盒子,右边为枚举放入了几个盒子,用斯特林数算出放球的方案,下降幂为选盒子。
那么
∑ i = 1 n i k = ∑ j = 1 n ∑ i = 0 k { i k } ∗ j i ‾ \sum_{i=1}^n i^k=\sum_{j=1}^n\sum_{i=0}^k \left\{ ^k_i \right\}*j^{\underline i} i=1nik=j=1ni=0k{ik}ji
= ∑ i = 0 k { i k } ∑ j = 1 n j i ‾ =\sum_{i=0}^k \left\{ ^k_i \right\}\sum_{j=1}^nj^{\underline i} =i=0k{ik}j=1nji
= ∑ i = 0 k { i k } i ! ∑ j = 1 n C j i =\sum_{i=0}^k \left\{ ^k_i \right\}i!\sum_{j=1}^nC_j^i =i=0k{ik}i!j=1nCji
= ∑ i = 0 k { i k } i ! C n + 1 i + 1 =\sum_{i=0}^k \left\{ ^k_i \right\}i!C_{n+1}^{i+1} =i=0k{ik}i!Cn+1i+1
这样的话就不用逆元了,复杂度是 O ( k 2 ) O(k^2) O(k2)

这篇关于自然数幂和 拉格朗日插值法和第二类斯特林数法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012435

相关文章

最优化方法Python计算:二次规划的拉格朗日算法

目标函数为二次式,约束条件为线性式的最优化问题称为二次规划。其一般形式为 { minimize 1 2 x ⊤ H x + c ⊤ x s.t.   A e q x − b e q = o A i q x − b i q ≥ o . \begin{cases} \text{minimize}\quad \frac{1}{2}\boldsymbol{x}^\top\boldsymbol{Hx}+\

计算方法——插值法程序实现(一)

例题 给出的函数关系表,分别利用线性插值及二次插值计算的近似值。 0.10.20.30.40.51.1051711.2214031.3498591.4918251.648721 参考代码一:Python代码实现(自编码) import math""":parameter用于计算插值多项式的系数"""def Parameters(data_x,data_y,size):param

要求输出1~n*n的自然数构成的魔方阵。(n15且为奇数)

【描述】 输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为       8 1 6       3 5 7       4 9 2 要求输出1~n*n的自然数构成的魔方阵。(n<15且为奇数) 【解题思路】 (1)第一个位置在第一行正中。 (2)新位置应处于 最近一个插入位置右上方,但如果右上方位置已超出方阵上边界,则新位置应选 列的最下

先从路径优化开始学习FastPlanner之B样条曲线平滑路径(一):从拉格朗日插值到B样条曲线

参考B站视频学习 注:我会列出学习他人的博客,但我不涉及具体推导,原理讲解,旨在于理解必须概念后写代码出效果。 给若干点如何获得一条平滑的曲线? 两个方法插值、拟合 插值要经过给定点,拟合不用经过。 经典插值方法:拉格朗日插值法和牛顿插值法。 区别: 拉格朗日插值法 优点 简单易懂: 拉格朗日插值法公式简单直观,易于理解和实现。无需求导: 拉格朗日插值法不需要对函数进行求导,只需知

探寻C/C++中更快的大数(自然数集)模板

本文系fcbruce个人原创整理,转载请注明出处http://blog.csdn.net/u012965890/article/details/40432511,谢谢! 我们知道在C/C++中int型可处理-2^31~2^31-1(32位及以上编译器),long long型可处理-2^63~2^63-1的数据,这实际上是非常有限的,在很多情况下,我们往往会处理范围更大的数据。Java中有B

近似求阶乘-斯特林公式

今天做Factstone Benchmark这个题,需要阶乘的近似值,用常规方法就是TLE,虽然我避开求阶乘,用为完成的中间值做为判断条件进而避免了TLE,但是这样的方法还是感觉不靠谱,经过查阅,果然有种可以近似求阶乘的东西,斯特林公式。 (baidu)斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十

智能优化算法改进策略之局部搜索算子(三)—二次插值法

1、原理介绍 多项式是逼近函数的一种常用工具。在寻求函数极小点的区间(即寻查区间)上,我们可以利用在若干点处的函数值来构成低次插值多项式,用它作为求极小点的函数的近似表达式,并用这个多项式的极小点作为原函数极小点的近似。低次多项式的极小点比较容易计算。常用的插值多项式为二次或三次,一般说来三次插值公式的收敛性好一些,但在导数不变计算时,三点二次插值也是一种常用的方法[1]。 3

组合数学 —— 斯特林数(Stirling)

【第一类斯特林数】 1.定理 第一类斯特林数 S1(n,m) 表示的是将 n 个不同元素构成 m 个圆排列的数目。 2.递推式 设人被标上1,2,.....p,则将这 p 个人排成 m 个圆有两种情况: 在一个圆圈里只有标号为 p 的人自己,排法有 S1(n-1,m-1) 个。p 至少和另一个人在一个圆圈里。 这些排法通过把 1,2....n-1 排成 m 个圆再把 n 放在 1,2.

Light OJ 1236 Race 第二类斯特林数

第二类斯特林数 n 匹马 分成1 2 3... n组 每一组就是相同排名 没有先后 然后组与组之间是有顺序的 在乘以组数的阶乘 #include <cstdio>#include <cstring>using namespace std;int dp[1010][1010];int a[1010];int main(){a[0] = 1;dp[0][0] = 1;for(int