LG4781 【模板】拉格朗日插值
题意
给定\(n\)个点\((x_i,y_i)\),请你确定这个多项式,并将\(k\)代入求值
求出的值对\(998244353\)取模
思路
学习了一下拉格朗日插值法(最菜的那种),其实还是挺好懂的
按照朴素思路,我们是构造一个矩阵,然后高斯消元法\(O(n^3)\),妥妥的\(TLE\)
那么
拉格朗日插值法的思路很简单,按照题目样例一给的三个点:
- 1 4
- 2 9
- 3 16
我们假设有以下\(3\) 个函数:
- \(G_1(x)=(x-2)(x-3)\)
- \(G_2(x)=(x-1)(x-3)\)
- \(G_3(x)=(x-1)(x-2)\)
因此,显然有
\(G_1(2)=G_1(3)=0\ ,\ G_2(1)=G_2(3)=0\ ,\ G_3(1)=G_3(2)=0\)
所以我们需要的原函数可以写为:
$f(x)=A_1G_1(x)+A_2G_2(x)+A_3G_3(x) $
那就很显然有
\[ \left\{\begin{aligned}
\\f(1)=A_1G_1(1)+A_2\times0+A_3\times 0=A_1G_1(1)
\\f(2)=A_1\times 0+A_2G_2(2)+A_3\times 0=A_2G_2(2)
\\f(3)=A_1\times 0+A_2\times 0+A_3G_3(3)=A_3G_3(3)
\end{aligned}
\right.
\]
所以把点值回带就能算\(A\)的值
总结一下并推广到其他情况,我们先构造了
\(G_i(x)=\prod_{j=1\&j\neq i}^n(x-x_j)\)
因为 \[A_i=\frac{y_i}{G_i(x_i)}\]
倒代入点的坐标得:
\[f(k)=\sum_{i=1}^n A_i G_i(k)\]
\[=\sum\frac{y_i}{G_i(x_i)}*G_i(k)\]
公式整理得:
\[f(x)=\sum_{i=1}^{n} y_i\times(\prod_{j\neq i }\frac{x-x_j}{x_i-x_j})\]
然后代码实现\(O(n^2)\)就非常简单了,注意逆元可以乘起来求一次,不需要每次求
#include <bits/stdc++.h>
const int N=2005;
int n,k,x[N],y[N],ans;
const int mu=998244353;
int ksm(int x,int y){
int ans=1;
for (;y;y>>=1,x=1ll*x*x%mu)
if (y&1) ans=1ll*ans*x%mu;
return ans;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d%d",&x[i],&y[i]);
for (int i=1;i<=n;i++){
int t=1,t2=1;
for (int j=1;j<=n;j++){
if (j==i) continue;
t=1ll*t*(k-x[j])%mu;
t2=1ll*t2*(x[i]-x[j])%mu;
}
ans=(ans+t*1ll*y[i]%mu*ksm(t2,mu-2))%mu;
}
printf("%d\n",(ans+mu)%mu);
}
后记
多项式一窍不通,以后要努力啊
参考
原文地址:https://www.cnblogs.com/flyfeather6/p/11690307.html
- Travis CI 使用详解
- git svn 命令详解
- Docker Swarm mode 详解
- Docker 私有仓库安装配置 (Registry v2)
- CoreOS 安装服务本地服务器 Docker 化
- 硬盘安装 CoreOS 三节点集群
- 从javascript脚本混淆说起
- CoreOS etcd3 集群实践
- Spring MVC学习教程之流程表单提交,3步实现这个功能
- PXE 模式启动 CoreOS
- iPXE 模式启动 CoreOS(简单、推荐使用)
- CoreOS 已废弃组件
- Docker Compose version 3 使用详解
- Virtualbox 安装 Alpine Linux
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 请求头headers
- Mac下用Parallels Desktop安装Ubuntu
- 2.02-request_header_two
- Centos安装Python3
- 2.03-handler_openner
- 2.04-proxy-handler
- 图形验证码的识别
- 2.05-random-uesr-proxy
- 5.01-requests_auth
- Git分支操作
- 5.02-requests_proxy
- 5.03-requests_ssl
- 5.04-requests_cookies
- 通过 Node.js 小示例学习浏览器缓存策略
- [未解决]报错: execjs._exceptions.ProgramError: TypeError: Cannot read property 'extend' of undefined