复函数,递归代入,可以得到最终的式子为$f(x-\sum_{i=1}^{m}{a_i})$,且$f(x) = \sum_{i = 0}^{n}{c_ix^i}$,求最终各个x项的系数。

设$S=\sum_{i=1}^{m}{a_i}$

先二项式展开

\begin{eqnarray*} f(x-S)&=&\sum_{i=0}^{n}{c_i{(x-S)}^i} \newline &=&\sum_{i=0}^{n}{ c^i\sum_{j=0}^{i}{ \binom{j}{i}x^{j}(-S)^{i-j} } }\end{eqnarray*}

交换求和符号

\begin{eqnarray*}&=&\sum_{j=0}^{n}{ x^{j} \sum_{i=0}^{n-j}{c_{i+j}\binom{j}{i+j}(-S)^{i}} } \newline &=&\sum_{j=0}^{n}{ x^{j} \sum_{i=0}^{n-j}{c_{i+j}\frac{(i+j)!}{{i!}{j!}}(-S)^{i}} }\newline &=&\sum_{j=0}^{n}{ \frac{x^{j}}{j!} \sum_{i=0}^{n-j}{c_{i+j}(i+j)! \frac{(-S)^{i}}{i!} } }\end{eqnarray*}

因为只要系数,也就是说对于每个j,得到对应的${j!}b_j$,求后一个求和符号里的值就行了

注意到卷积公式$\sum^{n}_{i=0}{f(i)h(n-i)}= f(n)*h(n)$,而且模数998244353是费马素数

故设$k = n - j, A[i] = \frac{(-S)^{i}}{i!},B[i]=c_{k-i-i}(k-i-j)! $,则$C[n - j] =\sum_{i=0}^{j}A[i]B[n-j-i]=\sum_{i=0}^{n-j} c_{i+j}(i+j)! \frac{(-S)^{i}}{i!} $

对A和B使用NTT加速卷积的计算,最后结果在A[i]上,记得反转为A[n-i]。推公式化卷积式,套模板。

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. using namespace std;
  4.  
  5. const LL N = 1e5 + 10;
  6. const LL mod = 998244353;
  7. const int g = 3;
  8. const int maxlen = 1 << 18;
  9.  
  10. LL wn[maxlen], fac[N], inv[N];
  11.  
  12. LL fpow(LL a, LL n)
  13. {
  14. LL ans = 1;
  15. while(n)
  16. {
  17. if(n & 1)
  18. ans = (ans * a % mod + mod) %mod;
  19. a = (a * a + mod) % mod;
  20. n >>= 1;
  21. }
  22. return ans;
  23. }
  24.  
  25. void init()
  26. {
  27. wn[0] = 1;
  28. wn[1] = fpow(g, ((mod - 1)>>18));
  29. for(int i = 2; i < maxlen; i++)
  30. wn[i] = wn[i - 1] * wn[1] % mod;
  31. fac[1] = inv[1] = 1;
  32. fac[0] = inv[0] = 1;
  33. for(int i = 2; i < N; i++)
  34. {
  35. fac[i] = fac[i - 1] * i % mod;
  36. inv[i] = (mod - mod / i) * inv[mod % i] % mod;
  37. }
  38. for(int i = 1; i < N; i++)
  39. (inv[i] *= inv[i - 1]) %= mod;
  40. }
  41.  
  42. void rader(LL f[], int len)
  43. {
  44. for(int i = 1, j = len >> 1; i < len - 1; i++)
  45. {
  46. if(i < j) swap(f[i], f[j]);
  47. int k = len >> 1;
  48. while(j >= k)
  49. {
  50. j -= k;
  51. k >>= 1;
  52. }
  53. if(j < k) j += k;
  54. }
  55. }
  56. void ntt(LL f[], int len, int on)
  57. {
  58. /*for(int i = 0, j = 0; i < len;i++)
  59. {
  60. if(i > j) swap(f[i], f[j]);
  61. for(int l = len >> 1; (j^=l) < l; l>>=1);
  62. }*/
  63. rader(f, len);
  64. for(int i = 1, d = 1; d < len; i++, d <<= 1)
  65. {
  66. //LL wnn = fpow(g, (mod-1)/(d<<1));
  67. for(int j = 0; j < len; j += (d << 1))
  68. {
  69. //LL w = 1;
  70. for(int k = 0; k < d; k++)
  71. {
  72. LL t = wn[(maxlen >> i) * k] * f[j + k + d] % mod;
  73. //LL t = w*f[j+k+d]%mod;
  74. //w = w*wnn % mod;
  75. f[j + k + d] = ((f[j + k] - t) % mod + mod) % mod;
  76. f[j + k] = ((f[j + k] + t) % mod + mod) % mod;
  77. }
  78. }
  79. }
  80. if(on == -1)
  81. {
  82. reverse(f + 1, f + len);
  83. LL inv2 = fpow(len, mod - 2);
  84. for(int i = 0; i < len; i++)
  85. f[i] = f[i] % mod * inv2 % mod;
  86. }
  87. }
  88.  
  89. void work(LL a[], LL b[], int len)
  90. {
  91. ntt(a, len, 1);
  92. ntt(b, len, 1);
  93. for(int i = 0; i < len; i++)
  94. a[i] = (a[i] * b[i] % mod + mod) % mod;
  95. ntt(a, len, -1);
  96. }
  97.  
  98. LL A[maxlen], B[maxlen], Suma, c[N];
  99. int n, m;
  100. int main()
  101. {
  102. init();
  103. while(~scanf("%d", &n))
  104. {
  105. for(int i = 0; i <= n; i++) scanf("%lld", c + i);
  106. scanf("%d", &m);
  107. Suma = 0;
  108. LL t;
  109. for(int i = 0; i < m; i++)
  110. scanf("%lld", &t), Suma -= t;
  111. Suma = (Suma + mod) % mod;
  112. while(Suma < 0)
  113. Suma += mod;
  114. if(Suma == 0)
  115. {
  116. for(int i = 0; i <= n; i++)
  117. printf("%lld ", c[i]);
  118. printf("\n");
  119. continue;
  120. }
  121. //getLength
  122. int len = 1;
  123. while(len <= 2*n) len <<= 1;
  124. //
  125. LL ae = 1;
  126. for(int i = 0; i < len; i++)
  127. {
  128. if(i <= n)
  129. {
  130. B[i] = ae * inv[i] % mod;
  131. A[i] =(fac[n - i] * c[n - i]) % mod;
  132. }
  133. else A[i] = B[i] = 0;
  134. ae = (ae * Suma) % mod;
  135. //cout << A[i] << "~"<< B[i] << endl;
  136. }
  137. work(A, B, len);
  138. for(int i = 0; i <= n; i++)
  139. A[i] = A[i] * inv[n - i] % mod;
  140. for(int i = 0; i <= n; i++)
  141. printf("%lld ", A[n - i]);
  142. printf("\n");
  143. }
  144. }

HDU 6061 推导 NTT的更多相关文章

  1. 2017 多校3 hdu 6061 RXD and functions

    2017 多校3 hdu 6061 RXD and functions(FFT) 题意: 给一个函数\(f(x)=\sum_{i=0}^{n}c_i \cdot x^{i}\) 求\(g(x) = f ...

  2. HDU 6061 - RXD and functions | 2017 Multi-University Training Contest 3

    每次NTT都忘记初始化,真的是写一个小时,Debug两个小时- - /* HDU 6061 - RXD and functions [ NTT ] | 2017 Multi-University Tr ...

  3. HDU 6061 RXD and functions(NTT)

    题意 给定一个\(n​\) 次的 \(f​\) 函数,向右移动 \(m​\) 次得到 \(g​\) 函数,第 \(i​\) 次移动长度是 \(a_i​\) ,求 \(g​\) 函数解析式的各项系数,对 ...

  4. HDU 6061 RXD and functions NTT

    RXD and functions Problem Description RXD has a polynomial function f(x), f(x)=∑ni=0cixiRXD has a tr ...

  5. HDU 6061 RXD and functions

    题目链接:HDU-6061 题意:给定f(x),求f(x-A)各项系数. 思路:推导公式有如下结论: 然后用NTT解决即可. 代码: #include <set> #include < ...

  6. HDU 5322 Hope ——NTT 分治 递推

    发现可以推出递推式.(并不会) 然后化简一下,稍有常识的人都能看出这是一个NTT+分治的情况. 然而还有更巧妙的方法,直接化简一下递推就可以了. 太过巧妙,此处不表,建议大家找到那篇博客. 自行抄写 ...

  7. HDU 5279 分治NTT 图的计数

    思路: 显然每个子图内都是森林 去掉所有子图1和n都连通且每条大边都存在的情况 直接DP上 NTT优化一波 注意前两项的值.. //By SiriusRen #include <bits/std ...

  8. HDU 5734 Acperience (推导)

    Acperience 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5734 Description Deep neural networks (DN ...

  9. HDU 2086 A1 = ? (找规律推导公式 + 水题)(Java版)

    Equations 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2086 ——每天在线,欢迎留言谈论. 题目大意: 有如下方程:Ai = (Ai-1 ...

随机推荐

  1. 跳蚤APP

    1.项目描述 我们致力于制作一款服务于校内师生的物品转让平台,在此平台上的用户可以发布要转让或欲购买的物品信息. 2.创新与收益 Need(需求) 如今在市场上有许多的二手交易线上平台,它们的服务范围 ...

  2. VK Cup 2015 - Qualification Round 1 D. Closest Equals 离线+线段树

    题目链接: http://codeforces.com/problemset/problem/522/D D. Closest Equals time limit per test3 secondsm ...

  3. Codeforces Round #335 (Div. 2) D. Lazy Student 贪心+构造

    题目链接: http://codeforces.com/contest/606/problem/D D. Lazy Student time limit per test2 secondsmemory ...

  4. git找回当前目录下误删的所有文件

    git checkout . 参考:http://opentechschool.github.io/social-coding/extras/delete-restore.html

  5. QUdpSocket-Qt使用Udp通讯实现服务端和客户端

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QUdpSocket-Qt使用Udp通讯实现服务端和客户端     本文地址:https:// ...

  6. List、Set、Map典型实现

    1:集合 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程 ...

  7. SpringMVC Ajax两种传参方式

    1.采用@RequestParam或Request对象获取参数的方法 注:contentType必须指定为:application/x-www-form-urlencoded @ResponseBod ...

  8. HDU4059_The Boss on Mars

    数论题. 首先我们知道公式:1^4+2^4+3^4+……+n^4=(n)*(n+1)*(2*n+1)*(3*n*n+3*n-1) /30; 然后我们要把多余的减掉.这里用到的是mobius反演. 总之 ...

  9. 51nod 1799 二分答案(分块打表)

    首先题目等价于求出满足运行二分程序后最后r=k的排列种数. 显然对于这样的二分程序,起作用的只有mid点,mid处的值决定了接下来要递归的子区间. 于是可以一遍二分求出有多少个mid点处的值<= ...

  10. 【转】小心stringstream.str()字符串用法的陷阱

    --------------------- 作者:心中那自由的世界 来源:CSDN 原文:https://blog.csdn.net/119365374/article/details/7744678 ...