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

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

相关文章

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

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

SVM(二)从拉格朗日对偶问题到SVM

2.1 拉格朗日对偶(Lagrange duality)      先抛开上面的二次规划问题,先来看看存在等式约束的极值问题求法,比如下面的最优化问题:              目标函数是f(w),下面是等式约束。通常解法是引入拉格朗日算子,这里使用来表示算子,得到拉格朗日公式为              L是等式约束的个数。     然后分别对w和求偏导,使得偏导数等

(c语法百题10)分离自然数

 知识点: /  % 的灵活运用。 内容: 一个三位自然数,分离出它的百位、十位与个位上的数字 输入说明: 一行一个三位整数 输出说明: 一行三个数字 , 空格隔开。分别是百 十 个位数字 输入样例: 256 输出样例 : 2 5 6 #include <stdio.h>int main(){int a;scanf("%d",&a);

Hdu 3625 Examining the Rooms[第一类斯特林数]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3625 题目意思: n(n <= 20)个房间。n把钥匙。每个房间有一把钥匙。一把钥匙只能开一把锁。 现在一个人手里没有钥匙,他可以强行打开一个门,然后拿出这个房间内的钥匙。不能够强行打开第一个门。。。 问最多强行打开k(k <= n)个房间的门的情况下,可以全部打开所有门的概率。。 分析

组合数学几类特殊的数,斯特林第一类数,斯特林第二类数,贝尔数

贝尔数 定义: Bn是基数为n的集合的划分方法的数目。集合S的一个划分是定义为S的两两不相交的非空子集的族,它们的并是S。例如B3 = 5因为3个元素的集合{a, b, c}有5种不同的划分方法: {{a}, {b}, {c}}, {{a}, {b, c}}, {{b}, {a, c}}, {{c}, {a, b}}, {{a, b, c}}。 B0是1,因为空集正好有1种划分方法

Python | C# | MATLAB 库卡机器人微分运动学 | 欧拉-拉格朗日动力学 | 混合动力控制

🎯要点 🎯正向运动学几何矩阵,Python虚拟机器人模拟动画二连杆平面机械臂 | 🎯 逆向运动学几何矩阵,Python虚拟机器人模拟动画三连杆平面机械臂 | 🎯微分运动学数学形态,Python模拟近似结果 | 🎯欧拉-拉格朗日动力学数学形态,Python模拟机器人操纵器推导的运动方程有效性 | 🎯运动规划算法,Python虚拟机器人和摄像头模拟离线运动规划算法 | 🎯移动导航卡尔曼

【数学】填不同的自然数 1/9=1/()+1/()+1/()+1/()+1/()

填不同的自然数 1 9 = 1 ( ) + 1 ( ) + 1 ( ) + 1 ( ) + 1 ( ) \frac{1}{9}=\frac{1}{(\text{ })}+\frac{1}{(\text{ })}+\frac{1}{(\text{ })}+\frac{1}{(\text{ })}+\frac{1}{(\text{ })} 91​=( )1​+( )1​+( )1​+( )1​+(

UVA 10844 - Bloques (第二类斯特灵数)

UVA 10844 - Bloques 题目链接 题意:给定n个数字,问这n个数字能分成子集分成有几种分法 思路:一开始先想了个状态,dp[i][j]表示放i个数字,分成j个集合的方案,那么转移为,从dp[i - 1][j - 1]在多一个集合,和从dp[i - 1][j]有j个位置放,那么转移方程为dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j] *