luogu P5667 拉格朗日插值2 拉格朗日插值 多项式多点求值 NTT
LINK:P5667 拉格朗日插值2
给出了n个连续的取值的自变量的点值 求 f(m+1),f(m+2),...f(m+n).
如果我们直接把f这个函数给插值出来就变成了了多项式多点求值 这个难度好像有点大。
不妨 直接考虑拉格朗日插值。
设此时要求f(k) 那么则有 \(\sum_{i=0}^nf(i)\frac{\Pi_{i\neq j}(k-j)}{\Pi_{i\neq j} (i-j)}\)
可以化简一下 \(f(k)=\sum_{i=0}^nf(i)\frac{ \Pi_{i\neq j}(k-j) \cdot (-1)^{k-i} }{fac_i\cdot fac_{n-i}}\)
其实还是可以化简的 \(f(k)=\sum_{i=0}^nf(i)\frac{ \Pi (k-j) \cdot (-1)^{k-i} }{fac_i\cdot fac_{n-i}}\cdot \frac{1}{k-i}\)
\(f(k)=\sum_{i=0}^nf(i)\frac{k!\cdot (-1)^{k-i} }{fac_i\cdot fac_{n-i}}\cdot \frac{1}{(k-i)\cdot (k-n-1)!}\)
再提出来一些项 \(f(k)=k!\cdot \frac{1}{(k-n-1)!}\sum_{i=0}^nf(i)\frac{(-1)^{k-i} }{fac_i\cdot fac_{n-i}}\cdot \frac{1}{(k-i)}\)
容易发现这类似于卷积的形式。
不过 如果直接做卷积会出现问题 因为卷积的时候i<=j 而并非i<=n.
需要解决这个问题 比较容易想到 把j放到靠后的位置就能得到贡献了。
那么其实就是 所以维护一个长度为2n的序列进行卷积即可。
这个时候 最好的方法就是 把两个多项式写下来 看一下卷积的过程。
分析一下每一个位置都应该是什么数字即可。
注意 卡常的话中间有一个求2n长度逆元的东西 可以采用前缀积后缀积的方法来优化成O(n).
但是 由于多项式长度2^20 还是跑的很慢.. 勉强卡过。
码力还行 出错的地方是 数组开小了 开了1e6 少开了一点 wa了3,4发 我tcl.
const int MAXN=1100010,G=3;
int lim,n,m,N;
int rev[MAXN];
ll f[MAXN],b[MAXN],a[MAXN];
ll fac[MAXN],pre[MAXN],suf[MAXN],inv[MAXN];
inline int ksm(ll b,int p)
{
ll cnt=1;
while(p)
{
if(p&1)cnt=cnt*b%mod;
p=p>>1;b=b*b%mod;
}
return cnt;
}
inline void NTT(ll *a,int op)
{
rep(0,lim-1,i)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int len=2;len<=lim;len=len<<1)
{
int mid=len>>1;
int wn=ksm(G,op==1?(mod-1)/len:mod-1-(mod-1)/len);
for(int j=0;j<lim;j+=len)
{
ll d=1;
for(int i=0;i<mid;++i)
{
ll x=a[i+j],y=a[i+j+mid]*d%mod;
a[i+j]=(x+y)%mod;a[i+j+mid]=(x-y+mod)%mod;
d=d*wn%mod;
}
}
}
if(op==-1)
{
int IN=ksm(lim,mod-2);
rep(0,lim-1,i)a[i]=a[i]*IN%mod;
}
}
int main()
{
//freopen("1.in","r",stdin);
get(n);get(m);fac[0]=1;
rep(0,n,i)get(f[i]);
rep(1,n,i)fac[i]=fac[i-1]*i%mod;
inv[n]=ksm(fac[n],mod-2);
fep(n-1,0,i)inv[i]=inv[i+1]*(i+1)%mod;
rep(0,n,i)a[i]=(f[i]*(((n-i)&1)?-1:1)%mod*inv[i]%mod*inv[n-i]%mod+mod)%mod;
pre[0]=1;N=n<<1|1;suf[N+1]=1;
rep(1,N,i)pre[i]=pre[i-1]*(m-n+i-1)%mod;
fep(N,1,i)suf[i]=suf[i+1]*(m+i-n-1)%mod;
ll IN=ksm(pre[N],mod-2);
rep(1,N,i)b[i]=pre[i-1]*suf[i+1]%mod*IN%mod;
lim=1;while(lim<N+N)lim=lim<<1;
rep(0,lim-1,i)rev[i]=rev[i>>1]>>1|((i&1)?lim>>1:0);
NTT(a,1);NTT(b,1);
rep(0,lim-1,i)a[i]=a[i]*b[i]%mod;
ll w=1;rep(m-n,m,i)w=w*i%mod;
b[n+1]=w;rep(n+2,N,i)b[i]=b[i-1]*(m+i-n-1)%mod*IN%mod*pre[i-n-2]%mod*suf[i-n]%mod;
NTT(a,-1);rep(n+1,N,i)printf("%lld ",a[i]*b[i]%mod);return 0;
}
中间的地方看起来确实比较ex... 这也是没有办法的事情。
luogu P5667 拉格朗日插值2 拉格朗日插值 多项式多点求值 NTT的更多相关文章
- 洛谷P5282 【模板】快速阶乘算法(多项式多点求值+MTT)
题面 传送门 前置芝士 \(MTT\),多项式多点求值 题解 这题法老当初好像讲过--而且他还说这种题目如果模数已经给定可以直接分段打表艹过去 以下是题解 我们设 \[F(x)=\prod_{i=0} ...
- 洛谷P5050 【模板】多项式多点求值
传送门 人傻常数大.jpg 因为求逆的时候没清零结果调了几个小时-- 前置芝士 多项式除法,多项式求逆 什么?你不会?左转你谷模板区,包教包会 题解 首先我们要知道一个结论\[f(x_0)\equiv ...
- 【洛谷P5050】 【模板】多项式多点求值
code: #include <bits/stdc++.h> #define ll long long #define ull unsigned long long #define set ...
- 多项式的各类计算(多项式的逆/开根/对数/exp/带余除法/多点求值)
预备知识:FFT/NTT 多项式的逆 给定一个多项式 F(x)F(x)F(x),请求出一个多项式 G(x)G(x)G(x),满足 F(x)∗G(x)≡1(mod xn)F(x)*G(x) \equiv ...
- [模板] 多项式: 乘法/求逆/分治fft/微积分/ln/exp/幂
多项式 代码 const int nsz=(int)4e5+50; const ll nmod=998244353,g=3,ginv=332748118ll; //basic math ll qp(l ...
- 多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]
全域多项式插值指的是在整个插值区域内形成一个多项式函数作为插值函数.关于多项式插值的基本知识,见“计算基本理论”. 在单项式基插值和牛顿插值形成的表达式中,求该表达式在某一点处的值使用的Horner嵌 ...
- Luogu 4781 【模板】拉格朗日插值
模板题. 拉格朗日插值的精髓在于这个公式 $$f(x) = \sum_{i = 1}^{n}y_i\prod _{j \neq i}\frac{x - x_i}{x_j - x_i}$$ 其中$(x_ ...
- 拉格朗日插值和牛顿插值 matlab
1. 已知函数在下列各点的值为 0.2 0.4 0.6 0.8 1.0 0.98 0.92 0.81 0.64 0.38 用插值法对数据进行拟合,要求给出Lagrange插值多项式和Newto ...
- 多项式函数插值:多项式形式函数求值的Horner嵌套算法
设代数式序列 $q_1(t), q_2(t), ..., q_{n-1}(t)$ ,由它们生成的多项式形式的表达式(不一定是多项式): $$p(t)=x_1+x_2q_1(t)+...x_nq_1(t ...
随机推荐
- H5和原生的职责划分
前言 在JSBridge实现后,前端网页与原生的交互已经通了,接下来就要开始规划API,明确需要提供哪一些功能来供前端调用. 但是在这之前,还有一点重要工作需要做: 明确H5与Native的职责划分, ...
- 16进制字符串转BCD码
15位IMEI字符串转8位BCD码 public static string SwapStr(string str) { return (str.Substring(1, 1) + str.Subst ...
- day61 django入门(2)
目录 一.数据的查.改.删 1 查 2 改 3 删 二.django orm中如何创建表关系 三.django请求生命周期流程图 四.路由层 1 无名分组 2 有名分组 3 两种分组不能混用,单个可以 ...
- 02 Vue指令
Vue指令 1.文本相关指令 <div id="app"> <!-- 插值表达式 --> <p>{{ msg }}</p> < ...
- java 数据结构(六):数组与集合
1. 集合与数组存储数据概述:集合.数组都是对多个数据进行存储操作的结构,简称Java容器.说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中) ...
- Python之爬虫(二十四) 爬虫与反爬虫大战
爬虫与发爬虫的厮杀,一方为了拿到数据,一方为了防止爬虫拿到数据,谁是最后的赢家? 重新理解爬虫中的一些概念 爬虫:自动获取网站数据的程序反爬虫:使用技术手段防止爬虫程序爬取数据误伤:反爬虫技术将普通用 ...
- Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?
Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?最近整理了一下项目的术语表.今天就谈谈为什么起了 Claptrap 和 Minion 两个名字. Claptr ...
- Ethical Hacking - Web Penetration Testing(6)
REMOTE FILE INCLUSION Similar to local file inclusion. But allows an attacker to read ANY file from ...
- Ethical Hacking - Web Penetration Testing(4)
CODE EXECUTION VULNS Allows an attacker to execute OS commands. Windows or Linux commands. Can be us ...
- Saas Erp以及分销 助手
首先贴一下相关的截图 SaasErp 登陆页 Saas Erp主页 Saas Erp 其中的商品页 Saas Erp 打印模板设计页 分销助手登录页/手势密码页/主页 1.SaaS是Software ...