分治FFT/NTT 模板
题目要我们求$f[i]=\sum\limits_{j=1}^{i}f[i-j]g[j]\;mod\;998244353$
直接上$NTT$肯定是不行的,我们不能利用尚未求得的项卷积
所以要用$CDQ$分治,先递归$[l,mid]$,然后处理$[l,mid]$对$[mid+1,r]$的影响,再递归$[mid+1,r]$
当我们处理$[l,mid]$对$[mid+1,r]$的影响时,$f[i](i\in [l,mid])$的是已经求完的,所以能用$NTT$卷积
细节比较多,注意不要让$f[i](i\in [mid+1,r])$进入卷积,因为这时的$f[i]$还没有求完,会让后面的答案错误,所以要另外开一个数组记录答案
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 (1<<17)+10
#define ll long long
#define dd double
#define inf 0x3f3f3f3f
using namespace std; const ll p=;
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){ x=; y=; return; }
exgcd(b,a%b,x,y); ll t=x; x=y; y=t-a/b*y;
}
ll qpow(ll x,ll y,const ll &mod)
{
ll ans=;
while(y){
if(y&) ans=ans*x%mod;
x=x*x%mod; y>>=;
}return ans;
}
int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int r[][N1];
ll A[N1],B[N1],C[N1],g[N1],f[N1],ret[N1],invl[N1],mulwn[N1],invwn[N1];
void Pre(int len,int L)
{
int i,j;ll inv,invy;
for(j=;j<=L;j++) for(i=;i<(<<j);i++)
r[j][i]=(r[j][i>>]>>)|((i&)<<(j-));
for(i=;i<=len;i<<=)
{
mulwn[i]=qpow(,(p-)/i,p);
exgcd(mulwn[i],p,inv,invy); invwn[i]=(inv%p+p)%p;
exgcd(i,p,inv,invy); invl[i]=(inv%p+p)%p;
}
}
void NTT(ll *s,int len,int type,int L)
{
int i,j,k,inv; ll w,wn,t;
for(i=;i<len;i++)
if(i<r[L][i]) swap(s[i],s[r[L][i]]);
for(k=;k<=len;k<<=)
{
wn=type>?mulwn[k]:invwn[k];
for(i=;i<len;i+=k)
{
for(j=,w=;j<(k>>);j++,w=w*wn%p)
{
t=w*s[i+j+(k>>)]%p;
s[i+j+(k>>)]=(s[i+j]-t+p)%p;
s[i+j]=(s[i+j]+t)%p;
}
}
}
if(type==-)
for(i=;i<len;i++)
s[i]=s[i]*invl[len]%p;
}
void NTT_Main(int len,int L)
{
NTT(A,len,,L); NTT(B,len,,L);
for(int i=;i<len;i++) C[i]=A[i]*B[i]%p;
NTT(C,len,-,L);
}
ll de(int x)
{
ll ans=;
for(int i=;i<=x;i++)
(ans+=g[i]*f[x-i]%p)%=p;
return ans;
}
int debug;
void CDQ(int l,int r,int L)
{
if(l==r){ ret[l]=f[l]; return; }
int mid=(l+r)>>,i;
CDQ(l,mid,L-);
if(l==&&r==)
debug=;
for(i=l;i<=r;i++) A[i-l]=ret[i],B[i-l]=g[i-l];
NTT_Main(r-l+,L);
for(i=mid+;i<=r;i++) (f[i]+=C[i-l])%=p;
CDQ(mid+,r,L-);
} int n,m,len,L;
int main()
{
freopen("t2.in","r",stdin);
scanf("%d",&n); int i; f[]=;
for(i=;i<n;i++) g[i]=gint();
for(len=,L=;len<n;len<<=,L++);
Pre(len,L);
CDQ(,len-,L);
for(i=;i<n;i++) printf("%lld ",f[i]);
puts("");
return ;
}
分治FFT/NTT 模板的更多相关文章
- 洛谷.4721.[模板]分治FFT(NTT)
题目链接 换一下形式:\[f_i=\sum_{j=0}^{i-1}f_jg_{i-j}\] 然后就是分治FFT模板了\[f_{i,i\in[mid+1,r]}=\sum_{j=l}^{mid}f_jg ...
- FFT/NTT模板 既 HDU1402 A * B Problem Plus
@(学习笔记)[FFT, NTT] Problem Description Calculate A * B. Input Each line will contain two integers A a ...
- 多项式FFT/NTT模板(含乘法/逆元/log/exp/求导/积分/快速幂)
自己整理出来的模板 存在的问题: 1.多项式求逆常数过大(尤其是浮点数FFT) 2.log只支持f[0]=1的情况,exp只支持f[0]=0的情况 有待进一步修改和完善 FFT: #include&l ...
- FFT NTT 模板
NTT: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; # ...
- 分治FFT/NTT
粘板子: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; t ...
- luoguP4721 【模板】分治 FFT (分治NTT)
给定 $g[1....n-1]$,求 $f[0],f[1],...,f[n-1]$,其中 $f[i]=\sum_{j=1}^{i}f[i-j]g[j]$ 变界为 $f[0]=1$ 答案模 9 ...
- 洛谷 P4721 【模板】分治 FFT 解题报告
P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...
- 【洛谷4721】【模板】分治FFT(CDQ分治_NTT)
题目: 洛谷 4721 分析: 我觉得这个 "分治 FFT " 不能算一种特殊的 FFT ,只是 CDQ 分治里套了个用 FFT (或 NTT)计算的过程,二者是并列关系而不是偏正 ...
- luoguP4721 【模板】分治 FFT
P4721 [模板]分治 FFT 链接 luogu 题目描述 给定长度为 \(n-1\) 的数组 \(g[1],g[2],..,g[n-1]\),求 \(f[0],f[1],..,f[n-1]\),其 ...
随机推荐
- 洛谷 P2633 Count on a tree
P2633 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中last ...
- spring mvc中的@propertysource
在spring mvc中,在配置文件中的东西,可以在java代码中通过注解进行读取了: @PropertySource 在spring 3.1中开始引入 比如有配置文件 config.propert ...
- Service启动模式
Service简单介绍 Service表示服务.是Android系统的核心组件之中的一个. Service的本质是一个继承了android.app.Service的java类: ...
- (转)Android开发书籍推荐:从入门到精通系列学习路线书籍介绍
Android开发书籍推荐:从入门到精通系列学习路线书籍介绍 转自:http://blog.csdn.net/findsafety/article/details/52317506 很多时候我们都会不 ...
- 备份SQL SERVER 2005数据库
- MongoDB: The Definitive Guide
第一章 简介 MongoDB是面向文档的数据库,不是关系型数据库.内置对MapReduce的支持,以及对地理空间索引的支持. 丰富的数据模型 容易扩展,它所采用的面向文档的数据模型可以使其在多台服务器 ...
- 干货 | TensorFlow的55个经典案例
转自1024深度学习 导语:本文是TensorFlow实现流行机器学习算法的教程汇集,目标是让读者可以轻松通过清晰简明的案例深入了解 TensorFlow.这些案例适合那些想要实现一些 TensorF ...
- 揭秘IPHONE X刷脸认证的技术奥秘
苹果最新发布的Iphone X具有一个全新的功能叫做刷脸认证,背后的技术其实是生物密码的更新,通过人脸识别取代了传统的指纹识别,大家肯定对这种新技术非常感兴趣,下面我们通过这篇文章为大家介绍人脸识别的 ...
- Android适配文件dimen自动生成代码
1:保存下,别人的code import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputSt ...
- 图的连通性问题的小结 (双连通、2-SAT)
图的连通性问题包括: 1.强连通分量. 2.最小点基和最小权点基. 3.双连通. 4.全局最小割. 5.2-SAT 一.强连通分量 强连通分量很少单独出题,一般都是把求强连通分量作为缩点工具. 有三种 ...