题目链接: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. asp.net core-12.dotnet watch run 和attach到进程调试

    1.打开visual studio code 创建一个项目 打开终端 输出:  dotnet new web --name hellocore 2.用visual studio code打开项目文件夹 ...

  2. 为什么用JS取不到cookie的值?解决方法如下!

    注意:cookie是基于域名来储存的.要放到测试服务器上或者本地localhost服务器上才会生效.cookie具有不同域名下储存不可共享的特性.单纯的本地一个html页面打开是无效的. 明明在浏览中 ...

  3. AtCoder练习

    1. 3721 Smuggling Marbles 大意: 给定$n+1$节点树, $0$为根节点, 初始在一些节点放一个石子, 然后按顺序进行如下操作. 若$0$节点有石子, 则移入盒子 所有石子移 ...

  4. RDS for MySQL 逻辑备份文件恢复到自建数据库

    使用MySQL自带的 mysqldump 工具可以通过逻辑备份文件恢复数据库,本文将介绍详细的逻辑备份恢复数据库操作步骤. 说明 通过物理备份文件恢复到自建数据库请参见RDS for MySQL 物理 ...

  5. MarkDown 语法记录

    Markdown是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式. 为啥要用 MarkDown 呢? 优点 1.因为是纯文本,所以只要支持Markdown的地方都能获 ...

  6. xposed获取context 的方法

    // 应用被加壳,采用这种方式加载类 try { XposedHelpers.findAndHookMethod(Application.class, "attach", Cont ...

  7. Kmalloc可以申请的最大内存

    Kmalloc申请的最大内存 以前虽然读过源码,但是对于它的申请上限确实没注意过.下面分析下,下面是kmalloc的源码. 可以看出,如果想知道kmalloc能申请的范围,需要跳转到<linux ...

  8. mongodb聚合查询-aggregate

    Mongodb-aggregate 在工作中经常遇到一些mongodb的聚合操作,和mysql对比起来,mongo存储的可以是复杂的类型,比如数组,字典等mysql不善于处理的文档型结构,但是mong ...

  9. macro 标签,和静态文件,以及templates

    1 模板 -Templates 1 什么是模板 模板,在Flask中就是允许响应给用户看的网页在模板中,允许包含“占位变量”来表示动态的内容 模板最终也会被解析成字符串再响应给客户端,这一过程通常称为 ...

  10. 2018年6月2日-徐州ICPC邀请赛日志-收获第一枚icpc奖牌

    2018年徐州ICPC邀请赛日志 Z的预言成真了,在正式比赛的前一天他的说说是“last one”,没错正赛后就是铜牌区的最后一名.最后揭榜前的15分钟,我们三个如坐针毡,最后奇迹诞生了!       ...