分治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]\),其 ...
随机推荐
- ExtJs之Ext.Model的MemoryProxy
书上的代码已完全不可参考,只好按知识点从网上查资料一个一个实例 了. <!DOCTYPE html> <html> <head> <title>ExtJ ...
- ASP.NET--MVC--伪静态
原文地址 以前伪静态很流行主要是为了SEO优化排名,现在搜索引擎对静态网站和动态网站的权重差不多了,就没有必要再伪静态了,个人意见,仅供参考. 有些客户要求设置静态的,为了完成需求,而且更简单的做法就 ...
- HDU 2224 The shortest path
The shortest path Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Spring MVC-表单(Form)标签-复选框集合(Checkboxes)示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_checkboxes.htm 说明:示例基于Spring MVC 4.1.6. 以 ...
- android 软键盘的显示与隐藏问题的研究
在android中,常常会和输入法的软件键盘交互.在Manifest文件中,系统给activity的一个属性-windowSoftInputMode来控制输入法的显示方式. 该属性提供了Activit ...
- AC自己主动机模板(数组实现版)
BY 九野 做了一道题,用我的那种写法华丽丽的超时了.,无奈学一学数组实现的 #include<stdio.h> #include<string.h> #include< ...
- POJ 3723 Tree(树链剖分)
POJ 3237 Tree 题目链接 就多一个取负操作,所以线段树结点就把最大和最小值存下来,每次取负的时候,最大和最小值取负后.交换就可以 代码: #include <cstdio> # ...
- Android.mk宏定义demo【转】
本文转载自:http://blog.csdn.net/u010164190/article/details/72783963 1.Android.mk LOCAL_PATH := $(call my ...
- 产生冠军--hdoj
产生冠军 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...
- 【POJ 2417】 Discrete Logging
[题目链接] http://poj.org/problem?id=2417 [算法] Baby-Step,Giant-Step算法 [代码] #include <algorithm> #i ...