P4721 【模板】分治 FFT

题目背景

也可用多项式求逆解决。

题目描述

给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\dots,f[n-1]\),其中\(f[i]=\sum_{j=1}^if[i-j]g[j]\)

边界为 \(f[0]=1\) 。答案模 \(998244353\) 。

输入输出格式

输入格式:

第一行一个正整数 \(n\) 。

第二行共 \(n−1\) 个非负整数 \(g[1],g[2],\dots,g[n-1]\),用空格隔开。

输出格式:

一行共 \(n\) 个非负整数,表示 \(f[0],f[1],\dots,f[n-1]\)模 \(998244353\) 的值。

说明

\(2\leq n\leq 10^5\)

\(0\leq g[i]<998244353\)


其实就是用了一下\(\text{CDQ}\)分治而已,听说比多项式求逆的应用范围要广一些 ,虽然复杂度是\(O(n\log^2n)\)的。

实现细节

  • 和斜率优化一样先左然后做然后去右边
  • 每次做NTT时注意不要从右半边的\(f\)取值,那边不是0...

Code:

#include <cstdio>
#include <algorithm>
#define ll long long
const int N=(1<<18)+10;
const ll mod=998244353,G=3,Gi=332748118;
#define mul(a,b) a*b%mod
ll qp(ll d,ll k){ll f=1;while(k){if(k&1) f=mul(f,d);d=mul(d,d);k>>=1;}return f;}
ll f[N],g[N],a[N],b[N];
int n,len,L,turn[N];
void NTT(ll *a,int typ)
{
for(int i=0;i<len;i++)
if(i<turn[i])
std::swap(a[i],a[turn[i]]);
for(int le=1;le<len;le<<=1)
{
ll wn=qp(typ?G:Gi,(mod-1)/(le<<1));
for(int p=0;p<len;p+=le<<1)
{
ll w=1;
for(int i=p;i<p+le;i++,w=w*wn%mod)
{
ll tmpx=a[i],tmpy=w*a[i+le]%mod;
a[i]=(tmpx+tmpy)%mod;
a[i+le]=(tmpx-tmpy)%mod;
}
}
}
}
void CDQfft(int l,int r)
{
if(l==r) {(f[l]+=g[l])%=mod;return;}
int mid=l+r>>1;
CDQfft(l,mid);
int m=r+1-l;
len=1,L=-1;
while(len<=m<<1) len<<=1,++L;
for(int i=0;i<len;i++) a[i]=b[i]=0,turn[i]=turn[i>>1]>>1|(i&1)<<L;
for(int i=l;i<=mid;i++) a[i+1-l]=f[i];
for(int i=1;i<=r+1-l;i++) b[i]=g[i];
NTT(a,1),NTT(b,1);
for(int i=0;i<len;i++) a[i]=mul(a[i],b[i]);
NTT(a,0);
ll inv=qp(len,mod-2);
for(int i=mid+1;i<=r;i++) (f[i]+=mul(a[i+1-l],inv))%=mod;
CDQfft(mid+1,r);
}
int main()
{
scanf("%d",&n);--n;
for(int i=1;i<=n;i++) scanf("%lld",g+i);
f[0]=1;
CDQfft(1,n);
for(int i=0;i<=n;i++) printf("%lld ",(f[i]+mod)%mod);
return 0;
}

2018.12.6

洛谷 P4721 【模板】分治 FFT 解题报告的更多相关文章

  1. 洛谷 P4721 [模板]分治FFT —— 分治FFT / 多项式求逆

    题目:https://www.luogu.org/problemnew/show/P4721 分治做法,考虑左边对右边的贡献即可: 注意最大用到的 a 的项也不过是 a[r-l] ,所以 NTT 可以 ...

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

  3. 解题:洛谷4721 [模板]分治FFT

    题面 这是CDQ入门题,不要被题目名骗了,这核心根本不在不在FFT上啊=.= 因为后面的项的计算依赖于前面的项,不能直接FFT.所以用CDQ的思想,算出前面然后考虑给后面的贡献 #include< ...

  4. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  5. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  6. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  7. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  8. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  9. 洛谷 P4319 变化的道路 解题报告

    P4319 变化的道路 题目描述 小 w 和小 c 在 H 国,近年来,随着 H 国的发展,H 国的道路也在不断变化着 根据 H 国的道路法,H 国道路都有一个值 \(w\),表示如果小 w 和小 c ...

随机推荐

  1. python全栈开发-面向对象-初识

    python_16_day 函数总结: https://www.processon.com/view/link/5b718274e4b0555b39e1055f 面向过程的程序设计的核心是过程(流水线 ...

  2. application/x-www-urlencoded与multipart/form-data

    学习ajax时,学到了GET与POST两种HTTP方法,于是去W3C看了二者的区别,里面提到了二者的编码类型不同,就在网上查阅了相关资料, 在这里把我查阅到的相关结果记录在此,方便以后学习,详细了解一 ...

  3. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

    1. 摘要 训练深层的神经网络非常困难,因为在训练的过程中,随着前面层数参数的改变,每层输入的分布也会随之改变.这需要我们设置较小的学习率并且谨慎地对参数进行初始化,因此训练过程比较缓慢. 作者将这种 ...

  4. 基于Docker Compose构建的MySQL MHA集群

    Docker MySQL MHA 基于Docker 1.13.1之上构建的MySQL MHA Docker Compose Project 可快速启动GTID模式下的MasterHA集群, 主用于My ...

  5. 联邦快递 IE和IP的区别 Fedex IE VS Fedex IP

    什么是FedEx IP? FedEx IP指的是联邦快递优先服务,时效比较快些,相对来说价格也比普通的高一些. 什么是FedEx IE? FedEx IE指的是联邦快递经济服务,时效与FedEx IP ...

  6. “Hello World!”团队第九次会议

    今天是我们团队“Hello World!”团队召开的第九次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 20 ...

  7. 《Linux内核与分析》第六周

    20135130王川东 1.操作系统的三大管理功能包括:进程管理,内存管理,文件系统. 2. Linux内核通过唯一的进程标识PID来区别每个进程.为了管理进程,内核必须对每个进程进行清晰的描述,进程 ...

  8. .net组件和com组件&托管代码和非托管代码

    com组件和.net组件: COM组件是非托管对象,可以不需要.NET框架而直接运行,.NET框架组件是托管对象,必须有.NET框架的支撑才能运行. COM组件有独立的类型库文件,而.NET组件是通过 ...

  9. hdu 1241--入门DFS

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  10. Firefox必备的24款web开发插件

    from: 软件过滤: 排序:收录时间 | 浏览数 网页开发FireFox插件 Firebug Firebug是Firefox下的一款开发类插件,现属于Firefox的 五星级强力推荐插件之一.它集H ...