高级操作,感觉非常神仙。

题目中的字母太难懂了,重新定义一下。

$$A(x) = B(x) * C(x) + D(x)$$

其中,$A(x)$的次数是$n$,$B(x)$的次数是$m$,$A, B$都已知,要求$C$的次数是$n - m$,$D$的次数小于$m$。

定义一种操作:

如果$A$的次数为$n$,那么

$$A_R(x) = x^nA(\frac{1}{x})$$

其实就是把一个多项式各项系数翻转过来。

比如$A(x) = x^3 + 2x^2 + 3x + 5$,有

$$A_R(x) = 5x^3 + 3x^2 + 2x + 1$$

有了这个操作之后就可以变魔术了。

发现这个$D(x)$很难受,想办法把它搞掉。

$$A(x) = B(x) * C(x) + D(x)$$

$$A(\frac{1}{x}) = B(\frac{1}{x})C(\frac{1}{x}) + D(\frac{1}{x})$$

两边乘上$x^n$,

$$x^nA(\frac{1}{x}) = x^mB(\frac{1}{x})x^{n - m}C(\frac{1}{x}) + x^{n - m + 1} * x^{m - 1}D(\frac{1}{x})$$

$$A_R(x) = B_R(x)C_R(x) + x^{n - m + 1} D_R(x)$$

两边模上$x^{n - m + 1}$,

$$A_R(x) \equiv B_R(x)C_R(x) (\mod x^{n - m + 1}) $$

其实就是求逆了呀。

求出$C(x)$之后只要重新算一遍多项式乘法减掉就可以算出$D(x)$了。

时间复杂度$O(nlogn)$。

Code:

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef vector <ll> poly; const int N = 1e5 + ; namespace Poly {
const int L = << ;
const ll P = 998244353LL; int lim, pos[L]; inline void deb(poly c) {
for (int i = ; i < (int)c.size(); i++)
printf("%lld%c", c[i], " \n"[i == (int)c.size() - ]);
} template <typename T>
inline void inc(T &x, T y) {
x += y;
if (x >= P) x -= P;
} template <typename T>
inline void sub(T &x, T y) {
x -= y;
if (x < ) x += P;
} inline ll fpow(ll x, ll y) {
ll res = ;
for (; y > ; y >>= ) {
if (y & ) res = res * x % P;
x = x * x % P;
}
return res;
} inline void prework(int len) {
int l = ;
for (lim = ; lim < len; lim <<= , ++l);
for (int i = ; i < lim; i++)
pos[i] = (pos[i >> ] >> ) | ((i & ) << (l - ));
} inline void ntt(poly &c, int opt) {
c.resize(lim, );
for (int i = ; i < lim; i++)
if (i < pos[i]) swap(c[i], c[pos[i]]);
for (int i = ; i < lim; i <<= ) {
ll wn = fpow(, (P - ) / (i << ));
if (opt == -) wn = fpow(wn, P - );
for (int len = i << , j = ; j < lim; j += len) {
ll w = ;
for (int k = ; k < i; k++, w = w * wn % P) {
ll x = c[j + k], y = w * c[j + k + i] % P;
c[j + k] = (x + y) % P, c[j + k + i] = (x - y + P) % P;
}
}
} if (opt == -) {
ll inv = fpow(lim, P - );
for (int i = ; i < lim; i++) c[i] = c[i] * inv % P;
}
} inline poly mul(const poly x, const poly y) {
poly u = x, v = y, res;
prework(x.size() + y.size() - );
ntt(u, ), ntt(v, );
for (int i = ; i < lim; i++) res.push_back(u[i] * v[i] % P);
ntt(res, -);
res.resize(x.size() + y.size() - );
return res;
} poly getInv(poly x, int len) {
x.resize(len, );
if (len == ) {
poly res;
res.push_back(fpow(x[], P - ));
return res;
} poly y = getInv(x, (len + ) >> ); prework(len << );
poly u = x, v = y, res;
ntt(u, ), ntt(v, );
for (int i = ; i < lim; i++) res.push_back(v[i] * ((2LL - u[i] * v[i] % P + P) % P) % P);
ntt(res, -); res.resize(len, );
return res;
} inline poly getDiv(poly x, poly y) {
poly u = x, v = y, res; reverse(u.begin(), u.end());
reverse(v.begin(), v.end());
// deb(u), deb(v); int len = x.size() - y.size() + ;
u.resize(len, ), v.resize(len, ); // deb(u), deb(v); res = getInv(v, len); // deb(res); res = mul(u, res);
res.resize(len);
// deb(u); reverse(res.begin(), res.end()); return res;
} inline poly getRest(poly x, poly y) {
poly u = x, v = y, res = getDiv(x, y); v = mul(v, res);
res = u;
int len = max(u.size(), v.size());
res.resize(len, ), v.resize(len, );
for (int i = ; i < len; i++) res[i] = (res[i] - v[i] + P) % P; for (; !res.empty() && !res[res.size() - ]; res.pop_back());
return res;
} } using Poly :: getDiv;
using Poly :: getRest; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for (; ch > ''|| ch < ''; ch = getchar())
if (ch == '-') op = -;
for (; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} int main() {
int n, m;
read(n), read(m);
++n, ++m; poly x, y;
x.resize(n, ), y.resize(m, );
for (int i = ; i < n; i++) read(x[i]);
for (int i = ; i < m; i++) read(y[i]); poly u = getDiv(x, y), v = getRest(x, y);
for (int i = ; i < (int)u.size(); i++)
printf("%lld%c", u[i], " \n"[i == (int)u.size() - ]);
for (int i = ; i < (int)v.size(); i++)
printf("%lld%c", v[i], " \n"[i == (int)v.size() - ]); return ;
}

Luogu 4512 【模板】多项式除法的更多相关文章

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

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

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

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

  3. P4512 【模板】多项式除法

    思路 多项式除法板子 多项式除法 给出\(A(x)\)和\(B(x)\),求一个\(n-m\)次的多项式\(D(x)\),一个\(m-1\)次多项式\(R(x)\),满足 \[ A(x)=B(x)D( ...

  4. [洛谷P4512]【模板】多项式除法

    题目大意:给定一个$n$次多项式$F(x)$和一个$m$次多项式$G(x)$,请求出多项式$Q(x),R(x)$,满足: 1. $Q(x)$次数为$n-m$,$R(x)$次数小于$m$2. $F(x) ...

  5. Re.多项式除法/取模

    前言 emmm又是暂无 前置 多项式求逆 多项式除法/取模目的 还是跟之前一样顾名思义] 给定一个多项式F(x),请求出多项式Q(x)和R(x),满足F(x)=Q(x)∗G(x)+R(x),R项数小于 ...

  6. [luogu P3384] [模板]树链剖分

    [luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点 ...

  7. xdoj-1211 (尧老师要教孩子解方程) :多项式除法

    想法: 1 由于所有a[i] 是不为0的整数 所以解x是整数 2 其次解是an的约数 3 分解a[n] 用多项式除法判断约数是否为整式的解 #include<cstdio> #includ ...

  8. 【Codechef】Random Number Generator(多项式除法)

    题解 前置技能 1.多项式求逆 求\(f(x)\*g(x) \equiv 1 \pmod {x^{t}}\) 我们在t == 1时,有\(f[0] = frac{1}{g[0]}\) 之后呢,我们倍增 ...

  9. Luogu P2742 模板-二维凸包

    Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...

  10. luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)

    luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...

随机推荐

  1. 在Android中来修改SQL里面的权限和显示内容

    1.在Android中建立了一个数据库. 然后要知道存储数据库的路劲.得到路劲然后进入cmd里面进到 手机终端. 2.利用splite3来显示数据库里面的东西. 3.利用chmod来修改数据库文件的权 ...

  2. 利用按钮来控制不同activity页面的移动

    1.现在手机都是利用移动的做法来使界面的跳转更美观. 那么对于一个activity来说的话,是会有一个坐标的(左上角为(0,0)坐标) 右为x轴且为正,下为y轴且为负. 由于要使界面跳转,可以水平方向 ...

  3. consul 1.2 支持service mesh

    主要说明: This release supports a major new feature called Connect that automatically turns any existing ...

  4. panabit web认证界面个性化

    原理:利用js代码在前端页面进行个性化 1.禁止信息提示 url:http://192.168.0.246:8010/restrict.htm 文件:restrict.png  restrict.ht ...

  5. app测试笔记记录

    1. 個性簽名保存成功,toast提示“儲存成功” 解释:  Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过 ...

  6. java之扫描包里面的class文件

    一.class作为,编译过后的产物,在很多时候,我们需要通过反射去执行class的具体方法.但是扫描class就是一个很大的问题了. 二.所以我这里写了一个简单的class文件扫描方式. 三.主要是利 ...

  7. ExtJS动态创建组件

    J是代码动态创建dom: 或者 eval有后台组织代码,前台执 ======================= ExtJS组件的动态的创建: 程序中大多数时候需要在后台根据业务逻辑创建符合要求的组件, ...

  8. js 取元素相对页面的高度和宽度

    function pos(elem) {    var x = elem.offsetLeft,  y = elem.offsetTop;    while (elem = elem.offsetPa ...

  9. sonar link 的安装与使用

    参考来源:https://jingyan.baidu.com/article/2a1383289bea98074a134ff6.html 工具/原料   版本要求Eclipse(4.2,3.8)以上, ...

  10. JS判断不能为空实例代码

    JS判断不能为空实例代码.分享在此. 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " ...