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. ESP8266 station模式下建立client、server TCP连接

    程序实现内容: 1.在station模式下,ESP8266作为client.server进行TCP连接2.实现数据的发送.接收(同时回传)实现思路:TCP网络通信分层为:应用层.网络层.数据链路层.物 ...

  2. [转]RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第一篇【安装】

    前言:关于RobotFrameWork+APPIUM实现对安卓APK的自动化测试的文章都是取自于乐于分享知识于网络的好心人们,所以我也希望我的知识可以分享给大家. 首先我们先罗列一下我们要安装的软件 ...

  3. 个人安装ss的一个记录

    在ubuntu16.04安装ss服务.由于lantern最近极其不稳定(我还花钱的qaq),经常断联以至于几乎废了,莫得办法,只好花钱搭一个了orz...呵,贫穷.... 安装shadowsocks ...

  4. 基于C#的机器学习--面部和动态检测-图像过滤器

    在本章中,我们将展示两个独立的例子,一个用于人脸检测,另一个用于动态检测,以及如何快速地将这些功能添加到应用程序中. 在这一章中,我们将讨论: 面部检测 动态检测 将检测添加到应用程序中 面部检测 人 ...

  5. 爬虫:Scrapy12 - Stats Collection

    Scrapy 提供了方便的收集数据的机制.数据以 key/value 方式存储,值大多是计数值.该机制叫做数据收集器(Stats Collector),可以通过 Crawler API 的属性 sta ...

  6. ORM(object relational Maping)

    ORM即对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中.本质上 ...

  7. 个人作业四:注册github

    注册Github账户 账户名称:liurunhan Github地址:https://github.com/liurunhan

  8. Alpha-9

    前言 失心疯病源9 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 今天完成了那些任务 熬夜肝代码 代码签入github 明天的计划 最好能够完成对接环节 准备展示内容 还剩下哪 ...

  9. Java对象创建过程补遗

    一.static修饰的东东是属于这个类的,是所有的该类的实例共享的,因此它们的初始化先于实例对象的初始化. 二.Java中没有静态构造方法,但是有静态代码块.当类中同时存在静态代码块和静态成员变量声明 ...

  10. udp 局域网群聊

    UDP: 无连接协议 udp协议发送数据,用的是数据报包的形式.(64KB以内)     发送端: 1.定义发送的datagramsocket对象,发送端可以不用定义端口 2.定义封装数据包datag ...