rstudio拉格朗日插值法_拉格朗日插值法学习笔记
拉格朗日插值法是一个根据点对求回原函数的算法,原理挺好懂的。
原理和优化方法上面的大佬都讲得很好。
其实主要就是这个式子:
然后暴力算这个式子的话是每求一项f(k)的时间复杂度都是n^2。
这个时间很不优秀,于是我们想办法在一些特殊时候优化它。
在x连续的时候我们可以通过预处理的方式加快速度,式子为
然后其实拉格朗日插值就上面两个式子,具体题目的具体点对不一样,但是插值的方法就是这样。
然后重心拉格朗日插值法就是把朴素的式子变形,它的好处是
虽然原理好懂代码好写,但是做题并不好做,得看出所求函数是几次多项式也得简略证明一下,这要求有一定的数学素养。这一个知识点蒟蒻还是差得很多,基本上就是做一题看一题题解。主要是虽然拉格朗日插值法不难,也好写。但是架不住我根本不知道要求的是哪个函数呀qwq qwq qwq,这样的话初始点对都求不出来,那还插个球。。。
总的来说,一定不能有式子恐惧症,要多加训练推式子的能力。加上这个知识点不怎么熟练,一定要回看。
题目练习:
洛谷P4781
模板题:
#include
using namespacestd;
typedeflong longLL;const int N=2e3+10;const int MOD=998244353;intn,k,x[N],y[N];intpower(LL x,LL p,LL MOD) {
LL ret=1;for (;p;p>>=1) {if (p&1) ret=ret*x%MOD;
x=x*x%MOD;
}return (int)ret;
}intLagrange() {int ret=0;for (int i=1;i<=n;i++) {int up=1,down=1;for (int j=1;j<=n;j++) {if (i==j) continue;
up=(LL)up*((k-x[j])%MOD+MOD)%MOD; //分子
down=(LL)down*((x[i]-x[j])%MOD+MOD)%MOD; //分母
}int tmp=(LL)y[i]*up%MOD*power(down,MOD-2,MOD)%MOD;
ret=(ret+tmp)%MOD;
}returnret;
}intmain()
{
cin>>n>>k;for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
cout<
}
View Code
洛谷P4593
看大佬题解,主要矛盾就是算sigma(i^m) (i=1~m+1) 这个用拉格朗日插值法可以解决。
#include
using namespacestd;
typedeflong longLL;const int N=100;const int P=1e9+7;intn,m;
LL jc[N],pre[N],suf[N],a[N],y[N];voidprework() {
jc[0]=1; for (int i=1;i<=60;i++) jc[i]=(jc[i-1]*i)%P;
}
LL power(LL x,LL p,LL MOD) {
LL ret=1;for (;p;p>>=1) {if (p&1) ret=ret*x%MOD;
x=x*x%MOD;
}returnret;
}//拉格朗日插值计算:sigma(i^m) (i=1~m+1) 因为计算m项要用m+1个点
LL Lagrange(intn) {
LL ret=0;
pre[0]=n; for (int i=1;i<=m+1;i++) pre[i]=(pre[i-1]*(n-i))%P; //预处理分子前缀
suf[m+2]=1; for (int i=m+1;i;i--) suf[i]=(suf[i+1]*(n-i))%P; //预处理分母后缀
for (int i=1;i<=m+1;i++) { //m+1个点插点
LL up=pre[i-1]*suf[i+1]%P;
LL down=jc[i]*jc[m+1-i]%P;if ((m+1-i)%2==1) down=P-down; //注意,(m+1-i)奇数项分母取反
LL tmp=up*power(down,P-2,P)%P*y[i]%P;
ret=(ret+tmp)%P;
}returnret;
}intmain()
{
prework();int T; cin>>T;while (T--) {
scanf("%d%d",&n,&m);for (int i=1;i<=m;i++) scanf("%d",&a[i]); a[++m]=++n;
sort(a+1,a+m+1);for (int i=1;i<=m+2;i++) y[i]=power(i,m,P);for (int i=1;i<=m+2;i++) y[i]=(y[i]+y[i-1])%P; //算出(x,y)点对
LL ans=0;for (int i=1;i<=m;i++) { //计算ans
for (int j=i;j<=m;j++) ans=(ans+Lagrange(a[j]-1)-Lagrange(a[j-1]))%P,ans=(ans+P)%P;for (int j=i+1;j<=m;j++) a[j]=a[j]-a[i]; a[i]=0;
}
printf("%lld\n",ans);
}return 0;
}
View Code
BZOJ-3453
惭愧的说,这题我现在还是不能完全理解为什么就能表示成K+4次多项式。但是其实能看出来的话也是直接插值就可以了。
#include
using namespacestd;
typedeflong longLL;const LL P=1234567891;const LL N=200+10;
LL k,a,n,d;
LL f[N],g[N];
LL power(LL x,LL p,LL MOD) {
LL ret=1;for (;p;p>>=1) {if (p&1) ret=ret*x%MOD;
x=x*x%MOD;
}returnret;
}//计算k项式(i,f[i])的第n项
LL Lagrange(LL *f,LL k,LL n) {
LL ret=0;for (int i=0;i<=k;i++) {
LL up=f[i],down=1;for (int j=0;j<=k;j++) {if (i==j) continue;
up=up*((n-j+P)%P)%P;
down=down*((i-j+P)%P)%P;
}
ret=(ret+up*power(down,P-2,P)%P)%P;
}returnret;
}intmain()
{int T; cin>>T;while (T--) {
memset(f,0,sizeof(f)); memset(g,0,sizeof(g));
scanf("%lld%lld%lld%lld",&k,&a,&n,&d);for (int i=1;i<=k+4;i++) f[i]=power(i,k,P);for (int i=1;i<=k+4;i++) f[i]=(f[i-1]+f[i])%P;for (int i=1;i<=k+4;i++) f[i]=(f[i-1]+f[i])%P;for (int i=0;i<=k+4;i++)
g[i]=((i>0?g[i-1]:0)+Lagrange(f,k+4,a+i*d))%P;
printf("%lld\n",Lagrange(g,k+4,n));
}return 0;
}
View Code
rstudio拉格朗日插值法_拉格朗日插值法学习笔记相关推荐
- 拉格朗日插值_拉格朗日插值定理的理论基础
缺失,几乎是不可避免的.只要做数据处理,不可避免的工作就是插值.而插值里面比较常用的方法之一就是拉格朗日插值法,这篇文章就跟大家讲讲拉格朗日插值的理论基础. 为什么需要进行插值 我们进行数据处理的理想 ...
- y空间兑换代码_【CV学习笔记】色彩空间
关注"深度学习冲鸭",一起学习一起冲鸭! 设为星标,第一时间获取更多干货 作者:云时之间来源:知乎链接:https://zhuanlan.zhihu.com/p/103387082 ...
- cs客户端 实时权限_【CS学习笔记】7、SMBbean的作用
0x00 SMB Beacon 简介 SMB Beacon 使用命名管道通过一个父 Beacon 进行通信.这种对等通信对同一台主机上的 Beacon 和跨网络的 Beacon 都有效.Windows ...
- 漏洞payload 靶机_【CS学习笔记】5、如何建立Payload处理器
这一小节学起来感觉有些吃力,里面很多概念理解的不是很清楚,如果有大佬看到描述错误的地方欢迎留言指正,避免误导他人. 再次声明,这只是我的个人学习笔记,不要当成教程去看,建议想学习CS的小伙伴可以看看A ...
- dw超链接标签_小花园DW学习笔记
点击蓝字关注我们 DW学习笔记 1.站点文件夹命名为学号-姓名,首页文件名为index.htm,站点所有图片均保存在images子目录中,图片可以从其它网站下载.抓图或手机拍照,要处理成.jpg或 ...
- malloc 源码_【C++学习笔记(九)】之 new运算符的使用/ new 与 malloc的异同(附代码,详细注释)...
new 运算符的使用 一. new的简单介绍: new运算符用于在堆区开辟空间,所有new出来的对象,对返回该类对象的指针. 二. new 与 malloc 的异同点: 1.malloc作用相同, m ...
- elasticsearch狂神说笔记_神级学习笔记!别再说不会Elasticsearch了,这位架构师都整理好了...
搜索是软件工程师的一项必备技能.而 Elasticsearch 就是一款功能强大的开源分布式搜索与分析引擎,在同领域几乎没有竞争对手--近三年 DB-Engines 数据库评测中,ES 在搜索引擎领域 ...
- 检测单击鼠标左键并拖动的消息_计算机视觉OpenCV学习笔记(四):关于鼠标的相关事件函数...
(7)把鼠标当画笔 本篇目标: 学会使用OpenCV中的鼠标处理的相关事件,事件回调函数怎么去定义,参数有哪些,以及如何注册鼠标监听事件. 7.1 .1 回调函数的定义: 1 def name(eve ...
- octave深度学习_【深度学习笔记】(一)Octave
[深度学习笔记](一)Octave Octave是一种面向科学数学运算的原型语言,内置了强大的数学函数及图形展示工具.原型prototyping设计的意思是使用ovtave进行算法设计.实现.验证等过 ...
- java 量化指标_量化投资学习笔记13——各种指标的绘图、计算及交易策略
<量化投资:以python为工具>第五部分笔记 先来画k线图,要注意finance模块已经从matplotlib库中去除,现在要用mpl_finance库,单独安装. 其中有candles ...
最新文章
- Linux 文件基本属性
- 5亿人都在用的拼多多还在亏损,百亿补贴仍将继续
- bt云服务器地址,windows2008搭建bttracker服务器
- pip install 报语法错误
- mac php 单元测试,PHPUnit单元测试
- Scylladb学习笔记
- 黄油刀的配置与使用——个人学习记录
- Debian本地源的创建及应用
- 30多种磁芯优缺点对比
- ubuntu中/etc/hosts文件的作用
- Git-用 cherry-pick 挑好看的小樱桃
- 康特EPON OLT开局配置
- 在Ubuntu20.04中继续使用linux版“网络调试助手”的方法
- Oracle出现 ins 35075提示的解决方法
- ssm体育用品库存管理毕业设计-附源码211712
- 大多数linux分区的文件系统,Linux分区、文件系统
- Python实现微信消息连续发送
- 建立DbLink 时报ORA-01017/ORA-02063分析及解决
- [解决办法]ubuntu14.04 adb devices无法识别手机
- 产品体验报告|知米,知否?