题目链接:LOJ

题目描述:输入多项式的次数$n$,一个整数$m$和$f(0),f(1),f(2),\ldots,f(n)$,输出$f(m),f(m+1),f(m+2),\ldots,f(m+n)$

数据范围:$1\leq n\leq 10^5,n<m\leq 10^8$

一道披着拉格朗日插值模板的外衣的数论题。。。

$$f(m+i)=\sum_{j=0}^nf(j)\dfrac{\prod_{k\not=j}(m+i-k)}{\prod_{k\not=j}(j-k)}$$

$$=\dfrac{(m+i)!}{(m-n+i-1)!}\sum_{j=0}^n\dfrac{f(j)*(-1)^{n-j}}{j!*(n-j)!}*\frac{1}{m+i-j}$$

预处理阶乘,逆元,阶乘逆元,和$mfac[i]=\prod_{j=0}^{i-1}(m-n+j)$,$m-n+i$的逆元和$mfac[i]$的逆元。

使用NTT计算,时间复杂度为$O(n\log n)$

 #include<bits/stdc++.h>
#define Rint register int
using namespace std;
typedef long long LL;
const int N = << , mod = , G = , Gi = ;
inline int kasumi(int a, int b){
int res = ;
while(b){
if(b & ) res = (LL) res * a % mod;
a = (LL) a * a % mod;
b >>= ;
}
return res;
}
int rev[N];
inline int calrev(int len){
int L = -, limit = ;
while(limit <= len){limit <<= ; L ++;}
for(Rint i = ;i < limit;i ++) rev[i] = (rev[i >> ] >> ) | ((i & ) << L);
return limit;
}
inline void NTT(int *A, int limit, int type){
for(Rint i = ;i < limit;i ++) if(i < rev[i]) swap(A[i], A[rev[i]]);
for(Rint mid = ;mid < limit;mid <<= ){
int Wn = kasumi(type == ? G : Gi, (mod - ) / (mid << ));
for(Rint j = ;j < limit;j += mid << ){
int w = ;
for(Rint k = ;k < mid;k ++, w = (LL) w * Wn % mod){
int x = A[j + k], y = (LL) w * A[j + k + mid] % mod;
A[j + k] = (x + y) % mod;
A[j + k + mid] = (x - y + mod) % mod;
}
}
}
if(type == -){
int inv = kasumi(limit, mod - );
for(Rint i = ;i < limit;i ++) A[i] = (LL) A[i] * inv % mod;
}
}
int fac[N], invfac[N], inv[N], mfac[N], minvfac[N], minv[N];
inline void init(int n, int m){
fac[] = mfac[] = ;
for(Rint i = ;i <= (n << | );i ++){
fac[i] = (LL) fac[i - ] * i % mod;
mfac[i] = (LL) mfac[i - ] * (m - n + i - ) % mod;
}
invfac[n << | ] = kasumi(fac[n << | ], mod - );
minvfac[n << | ] = kasumi(mfac[n << | ], mod - );
for(Rint i = (n << | );i;i --){
invfac[i - ] = (LL) invfac[i] * i % mod;
minvfac[i - ] = (LL) minvfac[i] * (m - n + i - ) % mod;
inv[i] = (LL) invfac[i] * fac[i - ] % mod;
minv[i] = (LL) minvfac[i] * mfac[i - ] % mod;
}
minv[] = ;
}
int n, m, f[N], A[N], B[N];
int main(){
scanf("%d%d", &n, &m);
for(Rint i = ;i <= n;i ++) scanf("%d", f + i);
init(n, m);
int limit = calrev(n * );
for(Rint i = ;i <= n;i ++){
A[i] = (LL) f[i] * invfac[i] % mod * invfac[n - i] % mod;
if(n - i & ) A[i] = mod - A[i];
}
for(Rint i = ;i <= (n << );i ++) B[i] = minv[i + ];
NTT(A, limit, ); NTT(B, limit, );
for(Rint i = ;i < limit;i ++) A[i] = (LL) A[i] * B[i] % mod;
NTT(A, limit, -);
for(Rint i = n;i <= (n << );i ++)
printf("%d ", (LL) mfac[i + ] * minvfac[i - n] % mod * A[i] % mod);
}

LOJ166

LOJ166 拉格朗日插值 2【卷积,NTT】的更多相关文章

  1. luogu P5667 拉格朗日插值2 拉格朗日插值 多项式多点求值 NTT

    LINK:P5667 拉格朗日插值2 给出了n个连续的取值的自变量的点值 求 f(m+1),f(m+2),...f(m+n). 如果我们直接把f这个函数给插值出来就变成了了多项式多点求值 这个难度好像 ...

  2. YbtOJ#903-染色方案【拉格朗日插值,NTT,分治】

    正题 题目链接:https://www.ybtoj.com.cn/contest/115/problem/3 题目大意 两个长度为\(n+1\)的序列\(a,b\) \(a_i\)表示涂了\(i\)个 ...

  3. EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)

    传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...

  4. 【bzoj3601】一个人的数论(莫比乌斯反演+拉格朗日插值)

    传送门 题意: 求\[ \sum_{i=1}^{n}i^d[gcd(i,n)=1] \] 思路: 我们对上面的式子进行变换,有: \[ \begin{aligned} &\sum_{i=1}^ ...

  5. 51nod1229-序列求和V2【数学,拉格朗日插值】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1229 题目大意 给出\(n,k,r\)求 \[\sum_{i=1}^ni ...

  6. Educational Codeforces Round 7 F - The Sum of the k-th Powers 拉格朗日插值

    The Sum of the k-th Powers There are well-known formulas: , , . Also mathematicians found similar fo ...

  7. 常系数齐次线性递推 & 拉格朗日插值

    常系数齐次线性递推 具体记在笔记本上了,以后可能补照片,这里稍微写一下,主要贴代码. 概述 形式: \[ h_n = a_1 h_{n-1}+a_2h_{n-2}+...+a_kh_{n-k} \] ...

  8. 快速排序 and 拉格朗日插值查找

    private static void QuictSort(int[] zu, int left, int right) { if (left < right) { ; ; ]; while ( ...

  9. BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值

    传送门 题面图片真是大到离谱-- 题目要求的是 \(\begin{align*}\sum\limits_{i=1}^N i^d[gcd(i,n) == 1] &= \sum\limits_{i ...

随机推荐

  1. 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法

    ref : https://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP ...

  2. Largest Submatrix 3 CodeForces - 407D (dp,好题)

    大意: 给定矩阵, 求选出一个最大矩形, 满足矩形内每个元素互不相同. 考虑枚举上下左三个边界, 求出最大右边界的位置. 注意到固定上边界, 下边界递推时, 每个左边界对应最大右边界是单调不增的. 所 ...

  3. B-JUI文档、下载

    概述 特别说明 本文档仅适用于最新版的B-JUI,网站首页或下载页可以查看B-JUI的最后更新时间. B-JUI前端管理框架适用于快速开发各类WEB管理系统,可与任意后端程序(java.php..ne ...

  4. Tomcat安装及其目录结构介绍

    Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选. Tomcat的安装版本有绿色解压 ...

  5. [Vue]Vue keep-alive

    keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们.和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 ...

  6. (二)ActiveMQ之点对点消息实现

    一.点对点消息实现概念 在点对点或队列模型下,一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息.这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列.这种模式被概括为:只有一个 ...

  7. sftp配置多个用户权限的问题

    groupadd group1 chmod 0755 /test/useradd -g group1 -d /test/backend/ -M test_backendusermod -s /sbin ...

  8. Python考试_第一次

    python基础数据类型考试题 考试时间:两个半小时 满分100分(80分以上包含80分及格) 一,基础题. 1. 简述变量命名规范(3分) 答:(1) 变量为数字,字母以及下划线的任意组合,且不能以 ...

  9. 3、java基础:抽象类与接口的区别

    抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...

  10. 如何搭建一个基于nuxt.js的项目

    介绍 nuxt.js(中文官方文档)是vue.js的一个通用型应用框架,有了之前搭建vue项目的过程之后,搭建一个nuxt项目就会十分简单. 搭建步骤 1.打开命令提示符,进入到相关文件夹下: 2.使 ...