题目大意:给定长度为$n-1$的数组$g_{[1,n)}$,求$f_{[0,n)}$,要求:

$$
f_i=\sum_{j=1}^if_{i-j}g_j\\
f_0=1
$$

题解:直接求复杂度是$O(n^2)$,明显不可以通过此题

分治$FFT$,可以用$CDQ$分治,先求出$f_{[l,mid)}$,可以发现这部分对区间的$f_{[mid,r)}$的贡献是$f_{[l,mid)}*g_{[0,r-l)}$,卷出来加到对应位置就行了,复杂度$O(n\log_2^2n)​$

卡点:

C++ Code:

  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <cctype>
  4. namespace std {
  5. struct istream {
  6. #define M (1 << 21 | 3)
  7. char buf[M], *ch = buf - 1;
  8. inline istream() {
  9. #ifndef ONLINE_JUDGE
  10. freopen("input.txt", "r", stdin);
  11. #endif
  12. fread(buf, 1, M, stdin);
  13. }
  14. inline istream& operator >> (int &x) {
  15. while (isspace(*++ch));
  16. for (x = *ch & 15; isdigit(*++ch); ) x = x * 10 + (*ch & 15);
  17. return *this;
  18. }
  19. #undef M
  20. } cin;
  21. struct ostream {
  22. #define M (1 << 21 | 3)
  23. char buf[M], *ch = buf - 1;
  24. int w;
  25. inline ostream& operator << (int x) {
  26. if (!x) {
  27. *++ch = '0';
  28. return *this;
  29. }
  30. for (w = 1; w <= x; w *= 10);
  31. for (w /= 10; w; w /= 10) *++ch = (x / w) ^ 48, x %= w;
  32. return *this;
  33. }
  34. inline ostream& operator << (const char x) {*++ch = x; return *this;}
  35. inline ~ostream() {
  36. #ifndef ONLINE_JUDGE
  37. freopen("output.txt", "w", stdout);
  38. #endif
  39. fwrite(buf, 1, ch - buf + 1, stdout);
  40. }
  41. #undef M
  42. } cout;
  43. }
  44.  
  45. #define maxn 131072 | 3
  46. const int mod = 998244353, G = 3;
  47.  
  48. namespace Math {
  49. inline int pw(int base, int p) {
  50. static int res;
  51. for (res = 1; p; p >>= 1, base = static_cast<long long> (base) * base % mod) if (p & 1) res = static_cast<long long> (res) * base % mod;
  52. return res;
  53. }
  54. inline int inv(int x) {return pw(x, mod - 2);}
  55. }
  56.  
  57. int n;
  58. int f[maxn], g[maxn];
  59. namespace Poly {
  60. #define N 131072 | 3
  61. int s, lim, ilim, rev[N];
  62. int Wn[N + 1];
  63. inline void reduce(int &x) {x += x >> 31 & mod;}
  64. inline void clear(register int *l, const int *r) {
  65. if (l >= r) return ;
  66. while (l != r) *l++ = 0;
  67. }
  68. inline void init(const int n) {
  69. s = -1, lim = 1; while (lim <= n) lim <<= 1, s++; ilim = Math::inv(lim);
  70. for (int i = 1; i < lim; i++) rev[i] = rev[i >> 1] >> 1 | (i & 1) << s;
  71. const int t = Math::pw(G, (mod - 1) / lim);
  72. *Wn = 1; for (register int *i = Wn; i != Wn + lim; ++i) *(i + 1) = static_cast<long long> (*i) * t % mod;
  73. }
  74.  
  75. inline void NTT(int *A, const int op = 1) {
  76. for (register int i = 1; i < lim; i++) if (i < rev[i]) std::swap(A[i], A[rev[i]]);
  77. for (register int mid = 1; mid < lim; mid <<= 1) {
  78. const int t = lim / mid >> 1;
  79. for (register int i = 0; i < lim; i += mid << 1) {
  80. for (register int j = 0; j < mid; j++) {
  81. const int W = op ? Wn[t * j] : Wn[lim - t * j];
  82. const int X = A[i + j], Y = static_cast<long long> (A[i + j + mid]) * W % mod;
  83. reduce(A[i + j] += Y - mod), reduce(A[i + j + mid] = X - Y);
  84. }
  85. }
  86. }
  87. if (!op) for (int i = 0; i < lim; i++) A[i] = static_cast<long long> (A[i]) * ilim % mod;
  88. }
  89.  
  90. int A[N], B[N];
  91. void CDQ_NTT(const int l, const int r) {
  92. if (r - l < 2) return ;
  93. const int mid = l + r >> 1;
  94. CDQ_NTT(l, mid); init(r - l);
  95. std::copy(f + l, f + mid, A); clear(A + mid - l, A + lim);
  96. std::copy(g, g + r - l, B); clear(B + r - l, B + lim);
  97. NTT(A), NTT(B);
  98. for (int i = 0; i < lim; i++) A[i] = static_cast<long long> (A[i]) * B[i] % mod;
  99. NTT(A, 0);
  100. for (int i = mid; i < r; i++) reduce(f[i] += A[i - l] - mod);
  101. CDQ_NTT(mid, r);
  102. }
  103. #undef N
  104. }
  105.  
  106. int main() {
  107. std::cin >> n;
  108. for (int i = 1; i < n; i++) std::cin >> g[i];
  109. *f = 1;
  110. Poly::CDQ_NTT(0, n);
  111. for (int i = 0; i < n; i++) std::cout << f[i] << ' ';
  112. std::cout << '\n';
  113. return 0;
  114. }

  

[洛谷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. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

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

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

  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_求逆

    题目大意:给定长度为$n-1$的数组$g_{[1,n)}$,求$f_{[0,n)}$,要求: $$f_i=\sum_{j=1}^if_{i-j}g_j\\f_0=1$$ 题解:分治$FFT$博客,发现 ...

  9. POJ 1741.Tree and 洛谷 P4178 Tree-树分治(点分治,容斥版) +二分 模板题-区间点对最短距离<=K的点对数量

    POJ 1741. Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 34141   Accepted: 11420 ...

随机推荐

  1. Python破解压缩包密码问题

    所用知识 1. Pool 进程池 2. try...except 异常处理 3.枚举的方式 4.生成器的运用 逻辑关系 通过生成假密码去碰撞!捕获异常,一直碰撞,直到生成的密码与压缩包建立的密码对应, ...

  2. Java >>>运算符 和 >> 运算符

    >>> 在java 表示有符号右移.什么意思呢?就是最高位符号位也会移动. 我们知道,>>表示有符号右移. -1>> 1 = -1 -1>>2 = ...

  3. 屏蔽Drupal中的“Notice: Undefined index”警告

    原因:drupal默认使用E_ALL,即输出所有错误和警告.我们只需要修改错误显示级别即可. 方法: 1. 打开\sites\default\settings.php 追加一行 ini_set('er ...

  4. jQuery tableExport导出 excel

    上篇写的是jQuery 导出word,就试试导出excel.看见网上写的很乱,我这就把我写的整理下来,有部分来自网上capy 1.   js文件的引用 <script type="te ...

  5. ajax跨域请求php

    在众多站群中,不同功能的系统使用独立的一个域名,各系统之间存在相互调用的关系.使用js的XMLHttpRequest调用其他域名提示跨域权限不足.有些可能认为都同属于同一个顶级域名或者说域名一模一样怎 ...

  6. redis 类型、方法

    之前使用redis,现在对所有redis方法做一个总结: string类型 形式:key=>value; 说明:最简单的类型:一个key对应一个value,value保存的类型是二进制安全的,s ...

  7. python基础之全局局部变量及函数参数

    1.局部变量和全局变量 1.1局部变量 局部变量是在函数内部定义的变量,只能在定义函数的内部使用 函数执行结束后,函数内部的局部变量会被系统收回 不同函数可以定义相同名字的局部变量,但是各用个的互不影 ...

  8. HDU - 6444(单调队列+思维)

    链接:HDU - 6444 题意:给出一个包含 n 个数的环,每个数都有一个价值,起点任选,每次跳顺时针跳 k 个数,在哪个数就能获得该价值(包括起点),最多取 m 次,问最少需要补充多少价值,所拿的 ...

  9. Java学习 · 初识 面向对象深入二

    面向对象深入 1.            抽象类 a)     声明 i.           抽象方法和抽象类必须用abstract来修饰 ii.           没有方法体,不需要实现 b)  ...

  10. 【转载】appium 操作汇总

    '''.appium api第二弹 锋利的python,这是初稿,2015/1/5 如有错误的地方,请同学们进行留言,我会及时予以修改,尽量整合一份ok的api 作者:Mads Spiral QQ:7 ...