题目要我们求$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 模板的更多相关文章

  1. 洛谷.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 ...

  2. FFT/NTT模板 既 HDU1402 A * B Problem Plus

    @(学习笔记)[FFT, NTT] Problem Description Calculate A * B. Input Each line will contain two integers A a ...

  3. 多项式FFT/NTT模板(含乘法/逆元/log/exp/求导/积分/快速幂)

    自己整理出来的模板 存在的问题: 1.多项式求逆常数过大(尤其是浮点数FFT) 2.log只支持f[0]=1的情况,exp只支持f[0]=0的情况 有待进一步修改和完善 FFT: #include&l ...

  4. FFT NTT 模板

    NTT: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; # ...

  5. 分治FFT/NTT

    粘板子: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; t ...

  6. 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 ...

  7. 洛谷 P4721 【模板】分治 FFT 解题报告

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...

  8. 【洛谷4721】【模板】分治FFT(CDQ分治_NTT)

    题目: 洛谷 4721 分析: 我觉得这个 "分治 FFT " 不能算一种特殊的 FFT ,只是 CDQ 分治里套了个用 FFT (或 NTT)计算的过程,二者是并列关系而不是偏正 ...

  9. luoguP4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 链接 luogu 题目描述 给定长度为 \(n-1\) 的数组 \(g[1],g[2],..,g[n-1]\),求 \(f[0],f[1],..,f[n-1]\),其 ...

随机推荐

  1. javascript的函数、创建对象、封装、属性和方法、继承

    转自原文javascript的函数.创建对象.封装.属性和方法.继承 一,function 从一开始接触到js就感觉好灵活,每个人的写法都不一样,比如一个function就有N种写法 如:functi ...

  2. 介绍C++ STL常用模板使用方法的相关资料

    1.vector的几种初始化及赋值方式

  3. kvc和kvo的使用情况的了解

    了解cocoa:Cocoa是苹果公司为Mac OS X所创建的原生面向对象的API,是Mac OS X上五大API之中的一个(其他四个是Carbon.POSIX.X11和Java). 苹果的面向对象开 ...

  4. 具体解释linux文件处理的的经常使用命令

    原创Blog.转载请注明出处 附上之前訪问量比較高的几篇linux博客 本人使用shell的8个小技巧 grep的九个经典使用场景 sed命令具体解释 awk命令具体解释 linux中全部的东西都是文 ...

  5. Android之UtilsRequesServicetHelp工具类

    package com.example.getnetutil; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; ...

  6. 0x55 环形与后效性问题

    poj2228 分第一天是否熟睡DP两次 #include<cstdio> #include<iostream> #include<cstring> #includ ...

  7. Swift3.0 split函数切割字符串

    我们先看函数的原型: public func split(separator: Self.Iterator.Element, maxSplits: Int = default, omittingEmp ...

  8. B1237 [SCOI2008]配对 贪心 + dp

    我刚开始,我打眼一看:哇!网络流大水题,直接费用流板子,建边跟zz一样.结果看了一眼数据范围...gg,luogu上只能得30,直接建边就是n^2,1e5根本过不了.咋办,只能另谋出路.想不出来,看题 ...

  9. 【转】寻找最好的笔记软件:海选篇 (v1.0)

    原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b55.html   序言: 我见过的多数软件爱好者,无论是资深用户,还是初级用户,都有一个梦想:找到 ...

  10. 【算法】Quick Select

    针对问题 找到一对无序的数中第  K  大,或者第 K 小的元素,返回该元素的值或者它的 index(index 的情况比较适合这堆数每个都独一无二的情况,不然可能会有多个答案). 关键思想 拿一个数 ...