拉格朗日插值法是一个根据点对求回原函数的算法,原理挺好懂的。

原理和优化方法上面的大佬都讲得很好。

其实主要就是这个式子:

然后暴力算这个式子的话是每求一项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拉格朗日插值法_拉格朗日插值法学习笔记相关推荐

  1. 拉格朗日插值_拉格朗日插值定理的理论基础

    缺失,几乎是不可避免的.只要做数据处理,不可避免的工作就是插值.而插值里面比较常用的方法之一就是拉格朗日插值法,这篇文章就跟大家讲讲拉格朗日插值的理论基础. 为什么需要进行插值 我们进行数据处理的理想 ...

  2. y空间兑换代码_【CV学习笔记】色彩空间

    关注"深度学习冲鸭",一起学习一起冲鸭! 设为星标,第一时间获取更多干货 作者:云时之间来源:知乎链接:https://zhuanlan.zhihu.com/p/103387082 ...

  3. cs客户端 实时权限_【CS学习笔记】7、SMBbean的作用

    0x00 SMB Beacon 简介 SMB Beacon 使用命名管道通过一个父 Beacon 进行通信.这种对等通信对同一台主机上的 Beacon 和跨网络的 Beacon 都有效.Windows ...

  4. 漏洞payload 靶机_【CS学习笔记】5、如何建立Payload处理器

    这一小节学起来感觉有些吃力,里面很多概念理解的不是很清楚,如果有大佬看到描述错误的地方欢迎留言指正,避免误导他人. 再次声明,这只是我的个人学习笔记,不要当成教程去看,建议想学习CS的小伙伴可以看看A ...

  5. dw超链接标签_小花园DW学习笔记

    点击蓝字关注我们   DW学习笔记 1.站点文件夹命名为学号-姓名,首页文件名为index.htm,站点所有图片均保存在images子目录中,图片可以从其它网站下载.抓图或手机拍照,要处理成.jpg或 ...

  6. malloc 源码_【C++学习笔记(九)】之 new运算符的使用/ new 与 malloc的异同(附代码,详细注释)...

    new 运算符的使用 一. new的简单介绍: new运算符用于在堆区开辟空间,所有new出来的对象,对返回该类对象的指针. 二. new 与 malloc 的异同点: 1.malloc作用相同, m ...

  7. elasticsearch狂神说笔记_神级学习笔记!别再说不会Elasticsearch了,这位架构师都整理好了...

    搜索是软件工程师的一项必备技能.而 Elasticsearch 就是一款功能强大的开源分布式搜索与分析引擎,在同领域几乎没有竞争对手--近三年 DB-Engines 数据库评测中,ES 在搜索引擎领域 ...

  8. 检测单击鼠标左键并拖动的消息_计算机视觉OpenCV学习笔记(四):关于鼠标的相关事件函数...

    (7)把鼠标当画笔 本篇目标: 学会使用OpenCV中的鼠标处理的相关事件,事件回调函数怎么去定义,参数有哪些,以及如何注册鼠标监听事件. 7.1 .1 回调函数的定义: 1 def name(eve ...

  9. octave深度学习_【深度学习笔记】(一)Octave

    [深度学习笔记](一)Octave Octave是一种面向科学数学运算的原型语言,内置了强大的数学函数及图形展示工具.原型prototyping设计的意思是使用ovtave进行算法设计.实现.验证等过 ...

  10. java 量化指标_量化投资学习笔记13——各种指标的绘图、计算及交易策略

    <量化投资:以python为工具>第五部分笔记 先来画k线图,要注意finance模块已经从matplotlib库中去除,现在要用mpl_finance库,单独安装. 其中有candles ...

最新文章

  1. Linux 文件基本属性
  2. 5亿人都在用的拼多多还在亏损,百亿补贴仍将继续
  3. bt云服务器地址,windows2008搭建bttracker服务器
  4. pip install 报语法错误
  5. mac php 单元测试,PHPUnit单元测试
  6. Scylladb学习笔记
  7. 黄油刀的配置与使用——个人学习记录
  8. Debian本地源的创建及应用
  9. 30多种磁芯优缺点对比
  10. ubuntu中/etc/hosts文件的作用
  11. Git-用 cherry-pick 挑好看的小樱桃
  12. 康特EPON OLT开局配置
  13. 在Ubuntu20.04中继续使用linux版“网络调试助手”的方法
  14. Oracle出现 ins 35075提示的解决方法
  15. ssm体育用品库存管理毕业设计-附源码211712
  16. 大多数linux分区的文件系统,Linux分区、文件系统
  17. Python实现微信消息连续发送
  18. 建立DbLink 时报ORA-01017/ORA-02063分析及解决
  19. [解决办法]ubuntu14.04 adb devices无法识别手机
  20. 产品体验报告|知米,知否?

热门文章

  1. android 全局钩子,使用钩子技术改进Android程序安全性
  2. 分布式系统常见负载均衡算法
  3. Android:实现简单的手机号码归属地查询功能
  4. 杭电acm1720 A+B Coming
  5. 《临床医学丛书》征主编、副主编、编委
  6. DHCP服务器配置-Ubuntu
  7. 【Linux】七、DHCP服务器配置与管理
  8. 2018ap计算机考试时间,ap2018年考试时间是什么时候
  9. 萌熊跑酷(三)MVC的搭建
  10. Android实现进入页面停留多少秒