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

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

题解:分治$FFT$博客,发现这道题就是求$f*g=f-1$($f-1$就是没有常数项的$f$),改写一下式子:
$$
f*g\equiv f-1\pmod{x^n}\\
f-f*g\equiv1\pmod{x^n}\\
f*(1-g)\equiv1\pmod{x^n}\\
f\equiv(1-g)^{-1}\pmod{x^n}
$$

卡点:

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. const int mod = 998244353, G = 3;
  46. namespace Math {
  47. inline int pw(int base, int p) {
  48. static int res;
  49. 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;
  50. return res;
  51. }
  52. inline int inv(int x) {return pw(x, mod - 2);}
  53. }
  54.  
  55. inline void reduce(int &a) {a += a >> 31 & mod;}
  56. inline long long get_reducell(long long a) {return a += a >> 63 & mod;}
  57. namespace Poly {
  58. #define N (262144 | 3)
  59. int lim, ilim, s, rev[N];
  60. int Wn[N + 1];
  61. inline void init(int n) {
  62. s = -1, lim = 1; while (lim <= n) lim <<= 1, s++; ilim = Math::inv(lim);
  63. for (register int i = 1; i < lim; i++) rev[i] = rev[i >> 1] >> 1 | (i & 1) << s;
  64. const int t = Math::pw(G, (mod - 1) / lim);
  65. *Wn = 1; for (register int *i = Wn; i != Wn + lim; ++i) *(i + 1) = static_cast<long long> (*i) * t % mod;
  66. }
  67. inline void clear(register int *l, const int *r) {
  68. if (l >= r) return ;
  69. while (l != r) *l++ = 0;
  70. }
  71.  
  72. inline void NTT(int *A, const int op = 1) {
  73. for (register int i = 1; i < lim; i++) if (i < rev[i]) std::swap(A[i], A[rev[i]]);
  74. for (register int mid = 1; mid < lim; mid <<= 1) {
  75. const int t = lim / mid >> 1;
  76. for (register int i = 0; i < lim; i += mid << 1) {
  77. for (register int j = 0; j < mid; j++) {
  78. const int W = op ? Wn[t * j] : Wn[lim - t * j];
  79. const int X = A[i + j], Y = static_cast<long long> (A[i + j + mid]) * W % mod;
  80. reduce(A[i + j] += Y - mod), reduce(A[i + j + mid] = X - Y);
  81. }
  82. }
  83. }
  84. if (!op) for (register int *i = A; i != A + lim; ++i) *i = static_cast<long long> (*i) * ilim % mod;
  85. }
  86.  
  87. int C[N];
  88. void INV(int *A, int *B, int n) {
  89. if (n == 1) {*B = Math::inv(*A); return ;}
  90. INV(A, B, n + 1 >> 1);
  91. init(n + n - 1);
  92. std::copy(A, A + n, C); clear(C + n, C + lim);
  93. NTT(B), NTT(C);
  94. for (register int i = 0; i < lim; i++) B[i] = (2 - static_cast<long long> (B[i]) * C[i] % mod + mod) % mod * B[i] % mod;
  95. NTT(B, 0), clear(B + n, B + lim);
  96. }
  97. #undef N
  98. }
  99.  
  100. #define maxn (262144 | 3)
  101. int n, f[maxn], g[maxn];
  102.  
  103. int main() {
  104. std::cin >> n;
  105. *g = 1;
  106. for (int i = 1; i < n; i++) {
  107. std::cin >> g[i];
  108. g[i] = mod - g[i];
  109. }
  110. Poly::INV(g, f, 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. 洛谷P4841 城市规划(生成函数 多项式求逆)

    题意 链接 Sol Orz yyb 一开始想的是直接设\(f_i\)表示\(i\)个点的无向联通图个数,枚举最后一个联通块转移,发现有一种情况转移不到... 正解是先设\(g(n)\)表示\(n\)个 ...

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

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

  5. 洛谷P4841 城市规划(多项式求逆)

    传送门 这题太珂怕了……如果是我的话完全想不出来…… 题解 //minamoto #include<iostream> #include<cstdio> #include< ...

  6. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

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

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

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

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

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

  9. 洛谷P4238【模板】多项式求逆

    洛谷P4238 多项式求逆:http://blog.miskcoo.com/2015/05/polynomial-inverse 注意:直接在点值表达下做$B(x) \equiv 2B'(x) - A ...

随机推荐

  1. 说说CakePHP的关联模型之一 基本关联

    一个无论多么复杂的程序,拆开看无非是三种逻辑结构的组合:顺序结构.条件结构和循环结构. 类似的,数据库中表与表的之间的关联无外乎四种:一对一.一对多.多对一和多对多. CakePHP的模型层中定义了四 ...

  2. PostFix支持SMTP认证

    安装cyrus-sasl yum -y install cyrus-sasl* 启动服务,开机启动 service saslauthd start chkconfig saslauthd on 配置p ...

  3. git的一些操作指令

    1. mkdir learn 创建learn文件夹(也可不用命令创建,直接右击新建即可)   cd learn进入learn文件夹   git init  把learn文件夹 变成 可以用git管理的 ...

  4. hdu1050Moving Tables(贪心)

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

  5. artDialog使用说明(弹窗API)

    Js代码 2. 传入HTMLElement    备注:1.元素不是复制而是完整移动到对话框中,所以原有的事件与属性都将会保留 2.如果隐藏元素被传入到对话框,会设置display:block属性显示 ...

  6. Unity制作人物头像小图标和小地图

    人物头像的制作: 在场景中添加人物模型和环境模型 设置人物的layer为Player 在主摄像机的基础上,新建一个次摄像机并将摄像机镜头对准人物面部,调整至合适大小. 设置次摄像机 culling m ...

  7. Java开发工程师(Web方向) - 02.Servlet技术 - 第3章.Servlet应用

    第3章.Servlet应用 转发与重定向 转发:浏览器发送资源请求到ServletA后,ServletA传递请求给ServletB,ServletB生成响应后返回给浏览器. 请求转发:forward: ...

  8. 购物单:Excel的应用

    题目描述: 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠 ...

  9. zookeeper:一.zookeeper集群安装

    1.zookeeper简介2.安装zookeeper2.1 安装环境准备2.2 安装zookeeper2.2.1.解压zookeeper压缩包到/opt/zookeeper2.2.2.编辑zookee ...

  10. 接口_GET请求_基于python

    1.GET请求(不带参数) # coding:utf-8 import requests r=requests.get("https://www.baidu.com") #r即为r ...