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的更多相关文章

  1. 洛谷P5282 【模板】快速阶乘算法(多项式多点求值+MTT)

    题面 传送门 前置芝士 \(MTT\),多项式多点求值 题解 这题法老当初好像讲过--而且他还说这种题目如果模数已经给定可以直接分段打表艹过去 以下是题解 我们设 \[F(x)=\prod_{i=0} ...

  2. 洛谷P5050 【模板】多项式多点求值

    传送门 人傻常数大.jpg 因为求逆的时候没清零结果调了几个小时-- 前置芝士 多项式除法,多项式求逆 什么?你不会?左转你谷模板区,包教包会 题解 首先我们要知道一个结论\[f(x_0)\equiv ...

  3. 【洛谷P5050】 【模板】多项式多点求值

    code: #include <bits/stdc++.h> #define ll long long #define ull unsigned long long #define set ...

  4. 多项式的各类计算(多项式的逆/开根/对数/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 ...

  5. [模板] 多项式: 乘法/求逆/分治fft/微积分/ln/exp/幂

    多项式 代码 const int nsz=(int)4e5+50; const ll nmod=998244353,g=3,ginv=332748118ll; //basic math ll qp(l ...

  6. 多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]

    全域多项式插值指的是在整个插值区域内形成一个多项式函数作为插值函数.关于多项式插值的基本知识,见“计算基本理论”. 在单项式基插值和牛顿插值形成的表达式中,求该表达式在某一点处的值使用的Horner嵌 ...

  7. Luogu 4781 【模板】拉格朗日插值

    模板题. 拉格朗日插值的精髓在于这个公式 $$f(x) = \sum_{i = 1}^{n}y_i\prod _{j \neq i}\frac{x - x_i}{x_j - x_i}$$ 其中$(x_ ...

  8. 拉格朗日插值和牛顿插值 matlab

    1. 已知函数在下列各点的值为   0.2 0.4 0.6 0.8 1.0   0.98 0.92 0.81 0.64 0.38 用插值法对数据进行拟合,要求给出Lagrange插值多项式和Newto ...

  9. 多项式函数插值:多项式形式函数求值的Horner嵌套算法

    设代数式序列 $q_1(t), q_2(t), ..., q_{n-1}(t)$ ,由它们生成的多项式形式的表达式(不一定是多项式): $$p(t)=x_1+x_2q_1(t)+...x_nq_1(t ...

随机推荐

  1. 推荐一款ui架构--frozenui

    首页是这样定义的 移动框架 重磅出击 简单易用,轻量快捷,为移动端服务的前端框架 链接地址 http://frozenui.github.io/base.html#layout

  2. centos-docker安装及基本使用

    1.安装 1.安装之前 网络重启:service network restart 查看IP地址:ip addr 查看内核版本:uname -r 2.linux上安装docker 1.查看内核版本:un ...

  3. 「疫期集训day2」高地

    硝烟从凡尔登高地的东方升起...我只知道这里会发生世界上前所未有的一次战役------凡尔登的法军士兵 今天运气挺好,早自习刚复习完数论和二分图,考试时又复习了状压和Tarjan 于是乎成绩惨不忍睹 ...

  4. JAVA的8种基本数据类型分析

    基本数据类型(8个) 1.整数类型(4个)   字节个数 取值范围 byte(字节) 1(8位) -2^7~2^7-1 short(短整型) 2(16位) -2^15~2^15-1 int(整形) 4 ...

  5. Linux 字符处理之【grep】

    参数: -i: 不区分大小写 -c: 统计包含匹配的行数 -n: 输出行号 -v: 反向匹配 示例文件: (example.txt) The cat's name is Tom, what's the ...

  6. Ripple 20:Treck TCP/IP协议漏洞技术分析

    本文由“合天智汇”公众号首发,作者:b1ngo Ripple 20:Treck TCP/IP协议漏洞技术分析 Ripple20是一系列影响数亿台设备的0day(19个),是JSOF研究实验室在Trec ...

  7. bzoj3732Network

    bzoj3732Network 题意: 给一个无向图,k个询问求节点a到节点b最长边的最小值.n,k≤15000. 题解: ”最长边的最小值“经常可以用最小生成树解决,因为生成树里的每一条边都是可取的 ...

  8. Mysql UDF提权方法

    0x01 UDF UDF(user defined function)用户自定义函数,是mysql的一个拓展接口.用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sq ...

  9. 数据源管理 | 搜索引擎框架,ElasticSearch集群模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.集群环境搭建 1.环境概览 ES版本6.3.2,集群名称esmaster,虚拟机centos7. 服务群 角色划分 说明 en-maste ...

  10. 【一起学系列】之模板方法:写SSO我只要5分钟

    意图 定义一个操作中的算法的骨架,将一些步骤延迟到子类中. Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 模板方法模式的诞生 模板方法模式为我们提供了一 ...