Luogu 4512 【模板】多项式除法
高级操作,感觉非常神仙。
题目中的字母太难懂了,重新定义一下。
$$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 【模板】多项式除法的更多相关文章
- 洛谷.4512.[模板]多项式除法(NTT)
题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...
- 洛谷 P4512 [模板] 多项式除法
题目:https://www.luogu.org/problemnew/show/P4512 看博客:https://www.cnblogs.com/owenyu/p/6724611.html htt ...
- P4512 【模板】多项式除法
思路 多项式除法板子 多项式除法 给出\(A(x)\)和\(B(x)\),求一个\(n-m\)次的多项式\(D(x)\),一个\(m-1\)次多项式\(R(x)\),满足 \[ A(x)=B(x)D( ...
- [洛谷P4512]【模板】多项式除法
题目大意:给定一个$n$次多项式$F(x)$和一个$m$次多项式$G(x)$,请求出多项式$Q(x),R(x)$,满足: 1. $Q(x)$次数为$n-m$,$R(x)$次数小于$m$2. $F(x) ...
- Re.多项式除法/取模
前言 emmm又是暂无 前置 多项式求逆 多项式除法/取模目的 还是跟之前一样顾名思义] 给定一个多项式F(x),请求出多项式Q(x)和R(x),满足F(x)=Q(x)∗G(x)+R(x),R项数小于 ...
- [luogu P3384] [模板]树链剖分
[luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点 ...
- xdoj-1211 (尧老师要教孩子解方程) :多项式除法
想法: 1 由于所有a[i] 是不为0的整数 所以解x是整数 2 其次解是an的约数 3 分解a[n] 用多项式除法判断约数是否为整式的解 #include<cstdio> #includ ...
- 【Codechef】Random Number Generator(多项式除法)
题解 前置技能 1.多项式求逆 求\(f(x)\*g(x) \equiv 1 \pmod {x^{t}}\) 我们在t == 1时,有\(f[0] = frac{1}{g[0]}\) 之后呢,我们倍增 ...
- Luogu P2742 模板-二维凸包
Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...
- luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)
luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...
随机推荐
- Yii用AJAX注册验证
<script type="text/javascript"> $(document).ready(function(){ $('#RegisterForm_usern ...
- Redis学习笔记-安装篇(Centos7)
1.安装 这里使用源代码安装的方式,如果你希望使用yum或者rpm包安装的方式,可以百度一下,安装方法可谓多如牛毛. # 下载安装包 # wget http://download.redis.io/r ...
- Pgsql和Mysql的对比
工作中用过这两个数据库,但都不是太深入,仅限于用而已,但给我留下的印象就是Pgsql更好些,因为这两个库我都遇到过数据丢失的问题,前者我通过网上方法加自己的判断有惊无险的恢复了,而后者搜索各种资料加问 ...
- CentOS 下tomcat安装
1. 下载tomcat, http://apache.fayea.com/tomcat/tomcat-8/v8.5.16/bin/apache-tomcat-8.5.16.tar.gz 我下载的是这个 ...
- GNU Radio: Synchronization and MIMO Capability with USRP Devices
Application Note Synchronization and MIMO Capability with USRP Devices Ettus Research Introduction S ...
- 浅析 MySQL Replication(转)
目前很多公司中的生产环境中都使用了MySQL Replication ,也叫 MySQL 复制,搭建配置方便等很多特性让 MySQL Replication 的应用很广泛,我们曾经使用过一主拖20多个 ...
- emacs之配置speedbar
安装sr-speedbar,这样的话,speedbar就内嵌到emacs里面了 emacsConfig/speedbar-setting.el (require 'sr-speedbar) (setq ...
- Bootstrap-Plugin:折叠(Collapse)插件
ylbtech-Bootstrap-Plugin:折叠(Collapse)插件 1.返回顶部 1. Bootstrap 折叠(Collapse)插件 折叠(Collapse)插件可以很容易地让页面区域 ...
- Thinkphp 查询条件 and 和 or同时使用即复合查询
thinkphp 3.2快捷查询OR查询&分割表示AND查询讲解 快捷查询方式是一种多字段查询的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表 ...
- JSTL-c:forEach标签详解
c:forEach基本格式: <c:forEach var="每个变量名字" items="要迭代的list" varStatus="每个对象的 ...