【文文殿下】【洛谷】分治NTT模板
题解
可以计算每一项对后面几项的贡献,然后考虑后面每一项,发现这是一个卷积,直接暴力NTT就行了,发现它是一个有后效性的,我们选择使用CDQ分治。
Tips:不能像通常CDQ分治一样直接 每次递归两边,然后处理。应该先递归左边,然后处理,再递归右边,保证右边的所有需要的转移已经被计算出来。
参考代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
const int p(998244353);
int mul(int a,int b) {
return 1LL*a*b%p;
}
int inc(int a,int b) {
a+=b;
return a>=p?a-p:a;
}
int dec(int a,int b) {
a-=b;
return a<0?a+p:a;
}
int exp(int a,int b,int p) {
if(b<0) b+=p-1;
int ret=1,base(a);
while(b) {
if(b&1) ret=mul(ret,base);
base=mul(base,base);
b>>=1;
}
return ret;
}
void dft(int *a,int n,int inv) {
for(int i = 1,j=n>>1;i<n-1;++i) {
if(i<j) swap(a[i],a[j]);
int k = n>>1;
while(j>=k) j-=k,k>>=1;
j+=k;
}
for(int j = 2;j<=n;j<<=1) {
int wn=exp(3,(p-1)/j*inv,p);
for(int i = 0;i<n;i+=j) {
int w = 1;
for(int k = i;k<i+(j>>1);++k) {
int u(a[k]),t(mul(a[k+(j>>1)],w));
a[k]=inc(u,t);
a[k+(j>>1)]=dec(u,t);
w=mul(w,wn);
}
}
}
if(inv==-1) {
int iv = exp(n,p-2,p);
for(int i =0;i<n;++i) a[i]=mul(a[i],iv);
}
}
int n;
int g[maxn<<4],f[maxn<<4],tmp[maxn<<4],tmp2[maxn<<4];
void cdqntt(int l,int r) {
if(l>r) return;
if(l==r) return;
int mid = (l+r)>>1;
cdqntt(l,mid);
int lmt = 1;
while(lmt<=2*(r-l)) lmt<<=1;
for(int i = 0;i<lmt;++i) tmp[i]=tmp2[i]=0;
for(int i = 0;i<=r-l;++i) tmp2[i]=g[i];
for(int i = l;i<=mid;++i) {
tmp[i-l+1]=f[i];
}
dft(tmp,lmt,1);dft(tmp2,lmt,1);
for(int i = 0;i<lmt;++i) tmp[i]=mul(tmp[i],tmp2[i]);
dft(tmp,lmt,-1);
for(int j = mid+1;j<=r;++j) {
f[j]=inc(f[j],tmp[j-l+1]);
}
cdqntt(mid+1,r);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i = 1;i<n;++i) cin>>g[i];
f[0]=1;
cdqntt(0,n-1);
for(int i = 0;i<n;++i) cout<<f[i]<<' ';
return 0;
}
【文文殿下】【洛谷】分治NTT模板的更多相关文章
- FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)
前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...
- 洛谷 P3377 【模板】左偏树(可并堆)
洛谷 P3377 [模板]左偏树(可并堆) 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或 ...
- 洛谷 P3370 【模板】字符串哈希
洛谷 P3370 [模板]字符串哈希 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的 ...
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...
- 洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)
洛谷P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 刚学了FFT,我们来刷一道模板题. 题目描述 给定两个长度为 n 的两个十进制数,求它们的乘积. n<=100000 如 ...
- 洛谷 P1439 【模板】最长公共子序列
\[传送门啦\] 题目描述 给出\(1-n\)的两个排列\(P1\)和\(P2\),求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数\(n\), 接下来两行,每行为\(n\)个数,为 ...
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
- 洛谷P3387 【模板】缩点 题解
背景 今天\(loj\)挂了,于是就有了闲情雅致来刷\(luogu\) 题面 洛谷P3387 [模板]缩点传送门 题意 给定一个\(n\)个点\(m\)条边有向图,每个点有一个权值,求一条路径,使路径 ...
- 洛谷 P3919 【模板】可持久化数组(可持久化线段树/平衡树)-可持久化线段树(单点更新,单点查询)
P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...
- 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
随机推荐
- 简易非阻塞http服务器
说明 需要理解阻塞和非阻塞的区别,特别要注意非阻塞和异步不是一个概念,这个很容易弄错.云盘里面netty的书会讲这几个方面的区别,nodejs深入浅出关于异步编程章节里面 ...
- 转录组表达量计RPKM、FPKM、TPM说明
在转录组测序(RNA-Seq)中,基因的表达量是我们关注的重点.基因表达量的衡量指标有:RPKM.FPKM.TPM. RPKM:Reads Per Kilobase Million:说实话,这个英文说 ...
- 使用adb shell 模拟点击事件
针对问题[appium无法点击到某一内容,需要使用adb去执行点击事件] 需要命令: adb shell adb devices input [input可以实现的功能]: 输入文本信息:input ...
- 前端html的简单认识
一.html 超文本标记语言 hypertext markup language 二.html的结构 三.html标签格式 1.标签由<>把关键字括起来 2.标签通常是成对出现的 , eg ...
- mybatis拦截器案例之获取结果集总条数
最近做的项目前端是外包出去的,所以在做查询分页的时候比较麻烦 我们需要先吧结果集的条数返回给前端,然后由前端根据页面情况(当前页码,每页显示条数)将所需参数传到后端. 由于在项目搭建的时候,是没有考虑 ...
- Mathematics | Mean, Variance and Standard Deviation
Mean is average of a given set of data. Let us consider below example These eight data points have t ...
- HMM(隐马尔可夫模型)不断学习中
HMM(隐马尔可夫模型)是用来描述隐含未知参数的统计模型,举一个经典的例子:一个东京的朋友每天根据天气{下雨,天晴}决定当天的活动{公园散步,购物,清理房间}中的一种,我每天只能在twitter上看到 ...
- 2018.12.17 bzoj1406 : [AHOI2007]密码箱(简单数论)
传送门 简单数论暴力题. 题目简述:要求求出所有满足x2≡1mod  nx^2\equiv1 \mod nx2≡1modn且0≤x<n0\ ...
- Linux下通过管道杀死所有与tomcat相关的进程
先将正确的命令放上来: ps -ef | grep ps -ef将系统中运行的进程展示出来 选择带有tomcat的进程后同时去除自身带有grep的进程,毕竟本身运行的这条命令是与tomcat相关的 a ...
- DOS的几个常用命令
1.rem:注释 DOS中的注释,其后面的内容会被自动忽略.双冒号(::)也有相同的效果 相当于R语言和Python中的# 2.set:设置变量 set var = 1 将1赋值给变量var 打印出来 ...