题目大意:给定一个$n$次多项式$F(x)$和一个$m$次多项式$G(x)$,请求出多项式$Q(x),R(x)$,满足:

1. $Q(x)$次数为$n-m$,$R(x)$次数小于$m$
2. $F(x)=Q(x)\times G(x)+R(x)$

题解:多项式除法。
$$
F(x)\equiv Q(x)G(x)+R(x)(\bmod{x^n})\\
F(\dfrac 1 x)\equiv Q(\dfrac 1 x)G(\dfrac 1 x)+R(\dfrac 1 x)(\bmod{x^n})\\
x^nF(\dfrac 1 x)\equiv x^{n-m}Q(\dfrac 1 x)\cdot x^mG(\dfrac 1 x)+x^nR(\dfrac 1 x)(\bmod{x^n})\\
F_R(x)\equiv Q_R(x)G_R(x)+x^{n-m+1}R_R(x)(\bmod{x^n})\\
F_R(x)\equiv Q_R(x)G_R(x)(\bmod{x^{n-m+1}})\\
Q_R(x)\equiv F_R(x)G_R^{-1}(x)(\bmod{x^{n-m+1}})\\
R_R(x)=F_R(x)-G_R(x)Q_R(x)
$$
卡点:

C++ Code:

  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <cctype>
  4. namespace __IO {
  5. namespace R {
  6. int x, ch;
  7. inline int read() {
  8. ch = getchar();
  9. while (isspace(ch)) ch = getchar();
  10. for (x = ch & 15, ch = getchar(); isdigit(ch); ch = getchar()) x = x * 10 + (ch & 15);
  11. return x;
  12. }
  13. }
  14. }
  15. using __IO::R::read;
  16.  
  17. const int mod = 998244353, G = 3;
  18.  
  19. namespace Math {
  20. int x, y;
  21. inline int pw(int base, int p) {
  22. int res = 1;
  23. for (; p; p >>= 1, base = static_cast<long long> (base) * base % mod) if (p & 1) res = static_cast<long long> (res) * base % mod;
  24. return res;
  25. }
  26. void exgcd(int a, int b, int &x, int &y) {
  27. if (!b) x = 1, y = 0;
  28. else exgcd(b, a % b, y, x), y -= a / b * x;
  29. }
  30. inline int inv(int a) {
  31. exgcd(a, mod, x, y);
  32. return x + (x >> 31 & mod);
  33. }
  34. }
  35.  
  36. #define N 262144
  37. inline void reduce(int &a) {a += a >> 31 & mod;}
  38. inline void clear(int *l, const int *r) {
  39. if (l >= r) return ;
  40. while (l != r) *l++ = 0;
  41. }
  42.  
  43. namespace Poly {
  44. int lim, ilim, rev[N], s;
  45. int Wn[N + 1];
  46. inline void init(int n) {
  47. s = -1, lim = 1; while (lim < n) lim <<= 1, s++; ilim = Math::inv(lim);
  48. for (register int i = 0; i < lim; i++) rev[i] = rev[i >> 1] >> 1 | (i & 1) << s;
  49. const int t = Math::pw(G, (mod - 1) / lim);
  50. *Wn = 1; for (register int i = 1; i <= lim; i++) Wn[i] = static_cast<long long> (Wn[i - 1]) * t % mod;
  51. }
  52. void NTT(int *A, int op = 1) {
  53. for (register int i = 0; i < lim; i++) if (i < rev[i]) std::iter_swap(A + i, A + rev[i]);
  54. for (register int mid = 1; mid < lim; mid <<= 1) {
  55. const int t = lim / mid >> 1;
  56. for (register int i = 0; i < lim; i += mid << 1) {
  57. for (register int j = 0; j < mid; j++) {
  58. const int W = op ? Wn[t * j] : Wn[lim - t * j];
  59. const int X = A[i + j], Y = static_cast<long long> (A[i + j + mid]) * W % mod;
  60. reduce(A[i + j] += Y - mod), reduce(A[i + j + mid] = X - Y);
  61. }
  62. }
  63. }
  64. if (!op) for (register int i = 0; i < lim; i++) A[i] = static_cast<long long> (A[i]) * ilim % mod;
  65. }
  66. int C[N];
  67. void INV(int *A, int *B, int n) {
  68. if (n == 1) {
  69. *B = Math::inv(*A);
  70. return ;
  71. }
  72. INV(A, B, n + 1 >> 1);
  73. std::copy(A, A + n, C);
  74. init(n << 1), clear(C + n, C + lim);
  75. NTT(B), NTT(C);
  76. for (int i = 0; i < lim; i++) B[i] = (2 + mod - static_cast<long long> (C[i]) * B[i] % mod) * B[i] % mod;
  77. NTT(B, 0);
  78. clear(B + n, B + lim);
  79. }
  80. int D[N], E[N], F[N];
  81. void DIV(int *A, int *B, int *Q, int n, int m) {
  82. std::reverse_copy(A, A + n, D), std::reverse_copy(B, B + m, E);
  83. clear(D + n - m + 1, D + n);
  84. clear(E + n - m + 1, E + m);
  85. INV(E, F, n - m + 1), init(n - m + 1 << 1);
  86. NTT(D), NTT(F);
  87. for (int i = 0; i < lim; i++) Q[i] = static_cast<long long> (D[i]) * F[i] % mod;
  88. NTT(Q, 0);
  89. std::reverse(Q, Q + n - m + 1);
  90. for (int i = n - m + 1; i < lim; i++) Q[i] = 0;
  91. }
  92. int G[N];
  93. void DIV_MOD(int *A, int *B, int *Q, int *R, int n, int m) {
  94. DIV(A, B, Q, n, m);
  95. std::copy(Q, Q + n - m + 1, G);
  96. init(n << 1);
  97. NTT(A), NTT(B), NTT(G);
  98. for (int i = 0; i < lim; i++) R[i] = (A[i] + mod - static_cast<long long> (B[i]) * G[i] % mod) % mod;
  99. NTT(R, 0);
  100. }
  101. }
  102.  
  103. int A[N], B[N], Q[N], R[N];
  104. int n, m;
  105. int main() {
  106. n = read() + 1, m = read() + 1;
  107. for (int i = 0; i < n; i++) A[i] = read();
  108. for (int i = 0; i < m; i++) B[i] = read();
  109. Poly::DIV_MOD(A, B, Q, R, n, m);
  110. for (int i = 0; i < n - m + 1; i++) printf("%d ", Q[i]); puts("");
  111. for (int i = 0; i < m - 1; i++) printf("%d ", R[i]); puts("");
  112. return 0;
  113. }

  

[洛谷P4512]【模板】多项式除法的更多相关文章

  1. 洛谷 P4512 [模板] 多项式除法

    题目:https://www.luogu.org/problemnew/show/P4512 看博客:https://www.cnblogs.com/owenyu/p/6724611.html htt ...

  2. 洛谷.4512.[模板]多项式除法(NTT)

    题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...

  3. 洛谷.3803.[模板]多项式乘法(FFT)

    题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...

  4. 洛谷.3803.[模板]多项式乘法(NTT)

    题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...

  5. 洛谷.4238.[模板]多项式求逆(NTT)

    题目链接 设多项式\(f(x)\)在模\(x^n\)下的逆元为\(g(x)\) \[f(x)g(x)\equiv 1\ (mod\ x^n)\] \[f(x)g(x)-1\equiv 0\ (mod\ ...

  6. 洛谷 P4238 [模板] 多项式求逆

    题目:https://www.luogu.org/problemnew/show/P4238 看博客:https://www.cnblogs.com/xiefengze1/p/9107752.html ...

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

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

  8. 多项式求逆元详解+模板 【洛谷P4238】多项式求逆

    概述 多项式求逆元是一个非常重要的知识点,许多多项式操作都需要用到该算法,包括多项式取模,除法,开跟,求ln,求exp,快速幂.用快速傅里叶变换和倍增法可以在$O(n log n)$的时间复杂度下求出 ...

  9. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

随机推荐

  1. 并发任务管理器AsyncTaskManager

    //-------------------------------------------------------------------------- // // Copyright (c) BUS ...

  2. spring源码-开篇

    一.写博客也有一段时间了,感觉东西越来越多了,但是自己掌握的东西越来越少了,很多时候自己也在想.学那么多东西,到头来知道的东西越来越少了.是不是很奇怪,其实一点都不奇怪. 我最近发现了一个很大的问题, ...

  3. underscore.js 分析 第二天

    Underscore源码中有这么句obj.length === +obj.length意思是typeof obj.length == number,即检测obj的长度是否是数字我的理解:这么写是来检测 ...

  4. JQuery.extend扩展实现同步post请求

    有时需要在jQuery中实现同步post请求,而jquery自带的是异步,需要通过JQuery.extend扩展. 支持ie和firefox,方法转载而来.需要在submit前将form.append ...

  5. unity3d 角色头顶信息3D&2D遮挡解决方案(二)

    在阅读本文之前请先阅读上一篇文章:http://www.cnblogs.com/shenggege/p/4179012.html 本来一篇文章就可以说完了,但是上次只是实现了已知的一些功能 后来在实际 ...

  6. Fiddler使用总结(二)

    在上一篇中介绍了Fiddler的基本使用方法.通过上一篇的操作我们可以直接抓取浏览器的数据包.但在APP测试中,我们需要抓取手机APP上的数据包,应该怎么操作呢? Andriod配置方法: .确保手机 ...

  7. Web自动化测试环境搭建1(基于firefox火狐浏览器)

    自动化测试是时代趋势,因此很多测试人员开始研究自动化测试,web自动化测试化测试并不难,但是很多人都是被挡在了环境搭建这一步,后面学习激情全无,这里,韬哥手把手教大家搭建火狐浏览器下的自动化测试环境( ...

  8. tpo-08 C2 A strategy for attracting customers

    第 1 段 1.Listen to a conversation between a student and a business professor. 听一段学生和教授的对话. 第 2 段 1.So ...

  9. ConfigHelpers

    --默认值可以不传 local ConfigHelpers = {} --设置物体高亮 target:设置对象 isLigth:是否高亮 seeThrough:是否穿透(默认为true,穿透) sta ...

  10. ## 在webapp上使用input:file, 指定capture属性调用默认相机,摄像,录音功能

    在iOS6下开发webapp,使用inputz之file,很有用 <input type="file" accept="image/*" capture= ...