「题意」给定\(g[0]=1\),\(g[1~n-1]\)求序列\(f[i]=\sum_{j=1}^i f[i-j]*g[j]\ , i\in[1,n-1],f[0]=1\)。

「分析」分治处理区间[l,r],先递归求出[l,mid],在统计[l,mid]对[mid+1,r]的贡献,可以发现

\[f[x]+=\sum_{i=l}^{mid}f[i]*g[x-i]\ , x\in[mid+1,r]
\]

拿卷积算,令\(A[0,mid-l]\)=\(f[l,mid]\), \(B[l,r-l]\)=\(g[1,r-l]\) ,\(B[0]=0\),设\(C[i]\)=\(A[i]*B[i-j]\), 那么

\[f[x]+=\sum f[i]*g[x-1]=\sum A[i-l]*B[x-i]=C[x-l]
\]

套上ntt

「代码」

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=4e5+10;
  4. const int P=998244353,G=3;
  5. int n,lmt,l,rev[N];
  6. int g[N],f[N],A[N],B[N];
  7. int qpow(int x,int y) {
  8. int c=1;
  9. for(; y; y>>=1,x=1LL*x*x%P)
  10. if(y&1) c=1LL*c*x%P;
  11. return c;
  12. }
  13. void init(int len) {
  14. for(lmt=1,l=0; lmt<len+len; lmt<<=1) l++;
  15. for(int i=0; i<lmt; ++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
  16. }
  17. void numberTheoreticTransform(int a[N],int tp) {
  18. for(int i=0; i<lmt; ++i) if(i<rev[i]) swap(a[i],a[rev[i]]);
  19. for(int m=1; m<lmt; m<<=1) {
  20. long long wm=qpow(G,(P-1)/(m<<1));
  21. if(tp==-1) wm=qpow(wm,P-2);
  22. for(int i=0; i<lmt; i+=(m<<1)) {
  23. long long w=1,tmp;
  24. for(int j=0; j<m; ++j,w=w*wm%P) {
  25. tmp=w*a[i+j+m]%P;
  26. a[i+j+m]=(a[i+j]-tmp+P)%P;
  27. a[i+j]=(a[i+j]+tmp)%P;
  28. }
  29. }
  30. }
  31. if(tp==-1) {
  32. long long tmp=qpow(lmt,P-2);
  33. for(int i=0; i<lmt; ++i) a[i]=tmp*a[i]%P;
  34. }
  35. }
  36. void dfs(int l,int r) {
  37. if(l==r) return;
  38. int mid=(l+r)>>1;
  39. dfs(l,mid);
  40. init(r-l+1);
  41. for(int i=0; i<lmt; ++i) A[i]=B[i]=0;
  42. for(int i=l; i<=mid; ++i) A[i-l]=f[i];
  43. for(int i=0; i<=r-l; ++i) B[i]=g[i];
  44. numberTheoreticTransform(A,1);
  45. numberTheoreticTransform(B,1);
  46. for(int i=0; i<lmt; ++i) A[i]=1LL*A[i]*B[i]%P;
  47. numberTheoreticTransform(A,-1);
  48. for(int i=mid+1; i<=r; ++i) f[i]=(f[i]+A[i-l])%P;
  49. dfs(mid+1,r);
  50. }
  51. int main() {
  52. scanf("%d",&n);
  53. for(int i=1; i<n; ++i) scanf("%d",g+i);
  54. f[0]=1, dfs(0,n-1);
  55. for(int i=0; i<n; ++i) printf("%d ",f[i]);
  56. printf("\n");
  57. return 0;
  58. }

ubuntu的中括号怎么是这个鬼玩意儿//

[P4721] 分治 FFT的更多相关文章

  1. [洛谷P4721]分治FFT

    NTT入门,放个板子 // luogu-judger-enable-o2 #include <bits/stdc++.h> using namespace std; #define fr( ...

  2. 洛谷 4721 【模板】分治 FFT——分治FFT / 多项式求逆

    题目:https://www.luogu.org/problemnew/show/P4721 分治FFT:https://www.cnblogs.com/bztMinamoto/p/9749557.h ...

  3. 洛谷 P4721 【模板】分治 FFT 解题报告

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...

  4. P4721【模板】分治 FFT

    瞎扯 虽然说是FFT但是还是写了一发NTT(笑) 然后忘了IDFT之后要除个n懵逼了好久 以及递归的时候忘了边界无限RE 思路 朴素算法 分治FFT 考虑到题目要求求这样的一个式子 \[ F_x=\S ...

  5. [洛谷P4721]【模板】分治 FFT

    题目大意:给定长度为$n-1$的数组$g_{[1,n)}$,求$f_{[0,n)}$,要求: $$f_i=\sum_{j=1}^if_{i-j}g_j\\f_0=1$$ 题解:直接求复杂度是$O(n^ ...

  6. 洛谷P4721 【模板】分治 FFT(分治FFT)

    传送门 多项式求逆的解法看这里 我们考虑用分治 假设现在已经求出了$[l,mid]$的答案,要计算他们对$[mid+1,r]$的答案的影响 那么对右边部分的点$f_x$的影响就是$f_x+=\sum_ ...

  7. 洛谷P4721 【模板】分治 FFT(生成函数+多项式求逆)

    传送门 我是用多项式求逆做的因为分治FFT看不懂…… upd:分治FFT的看这里 话说这个万恶的生成函数到底是什么东西…… 我们令$F(x)=\sum_{i=0}^\infty f_ix^i,G(x) ...

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

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

  9. [题解] Luogu P4721 【模板】分治 FFT

    分治FFT的板子为什么要求逆呢 传送门 这个想法有点\(cdq\)啊,就是考虑分治,在算一段区间的时候,我们把他分成两个一样的区间,然后先做左区间的,算完过后把左区间和\(g\)卷积一下,这样就可以算 ...

随机推荐

  1. cobbler自动装机服务简介与配置

    cobbler简介 Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速安装.重装物理服务器和虚拟机,同时还可以管理DHCP,DNS等. Cobbler可以使用命令行 ...

  2. ContentType与SpiringMvc

    转载https://blog.csdn.net/mingtianhaiyouwo/article/details/51459764

  3. 大面积project.pbxproj冲突问题解决

    在团队开发中,经常会有project.pbxproj的冲突出现. 所以我们添加过新的文件后,要及时的提交,养成好习惯.以免出问题. 但是总有一些时候忘记提交出现大面积的冲突,然后把==== <& ...

  4. web安全系列2:http初探

    web安全系列的第二篇 首先,我们先来理解两个名词C/S架构和B/S架构. 所谓C/S架构,就是客户机/服务器架构,而B/S架构就是浏览器/服务器架构.C/S是通常的桌面程序的架构方式,而B/S就是网 ...

  5. jquery学习总结24-36

    一.jquery的自定义事件 1.自定义事件不能通过eventName()来添加,只能通过on来绑定 2.自定义事件需要通过trigger(自动触发)来进行触发 二.jauery事件命名空间 1.事件 ...

  6. version control

    what 版本控制最主要的功能就是追踪文件的变更.它将什么时候.什么人更改了文件的什么内容等信息忠实地了已录下来.每一次文件的改变,文件的版本号都将增加.除了记录版本变更外,版本控制的另一个重要功能是 ...

  7. java+phantomjs实现动态网页抓取

    1.下载地址:http://phantomjs.org/download.html 2.java代码 public void getHtml(String url) { HTML="&quo ...

  8. 在JAVA中对于类,对象,继承,多态的看法

    这是我第一次学高级语言.很抱歉选择了JAVA,目标是开发一款可以上线的APP. 类:是建立对象的一个模板,就是系列产品中的基础款图纸.只是图纸而已.不是产品. 对象:是一个可以操作的对象.新建一个对象 ...

  9. bgfx入门练习3——编译自定义Shader

    马个鸡,总算编译过了自定义Shader,在此感谢自己,感谢自己,以及感谢自己.没有自己的努力,我是不可能解决这个问题的,自己真是太叼了.妈的智障!!! 管方那屎一样的make工具根本没用,反正我是折腾 ...

  10. submit与execute区别

    1.可以接受的任务类型 submit: execute: 可以看出: execute只能接受Runnable类型的任务 submit不管是Runnable还是Callable类型的任务都可以接受,但是 ...