题目要我们求$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. WebApplicationInitializer究 Spring 3.1之无web.xml式 基于代码配置的servlet3.0应用

    本文转自http://hitmit1314.iteye.com/blog/1315816 大家应该都已经知道Spring 3.1对无web.xml式基于代码配置的servlet3.0应用.通过spri ...

  2. Ruby 读取文件

    Ruby 读取文件 一次全读出来 textAll = File.read("fileName.txt") puts textAll 一次读取一行 file = File.open( ...

  3. 3.2 re--正則表達式操作(Regular expression operations)

    本模块提供了正則表達式的匹配操作,它的功能跟Perl语言里的功能一样. 不管是Unicode字符串还是单字节8位组成的字符串,都能够使用模式匹配和字符串查找的功能. 只是要注意的是Unicode字符串 ...

  4. PAAS平台的web应用性能測试与分析

    引言 为什么我会写这一篇博客,由于近期非常多京东云擎jae的用户反应一个问题就是他们部署在jae上面的应用訪问非常慢,有极少数应用甚至常常出现504超时现象.当然大家首先想到的是jae性能太差,这也是 ...

  5. BNU 34986 Football on Table

    "Bored? Let's play table football!" The table football is played on a rectangular table, u ...

  6. iOS8 tableView的Cell高度自适应开发

    1.在- (void)viewDidLoad中设置: //估计高度为81 self.tableView.estimatedRowHeight = 81.0f; //自适应高度 self.tableVi ...

  7. bzoj4240: 有趣的家庭菜园(树状数组+贪心思想)

    4240: 有趣的家庭菜园 题目:传送门 题解: 好题!%%% 一开始不知道在想什么鬼,感觉满足二分性?感觉可以维护一个先单调增再单调减的序列? 然后开始一顿瞎搞...一WA 看一波路牌...树状数组 ...

  8. Powershell 渗透测试工具-Nishang

    Powershell 渗透测试工具-Nishang 分享到: 作者:V1ct0r 稿费:500RMB(不服你也来投稿啊!) 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 传送门 ...

  9. CodeForces 660A

    Description You are given an array of n elements, you must make it a co-prime array in as few moves ...

  10. 大数字运算——2、BigDecimal

    package com.wh.BigInteger; import java.math.BigDecimal; import java.util.Arrays; /** * @author 王恒 * ...