[洛谷P4512]【模板】多项式除法
题目大意:给定一个$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:
#include <algorithm>
#include <cstdio>
#include <cctype>
namespace __IO {
namespace R {
int x, ch;
inline int read() {
ch = getchar();
while (isspace(ch)) ch = getchar();
for (x = ch & 15, ch = getchar(); isdigit(ch); ch = getchar()) x = x * 10 + (ch & 15);
return x;
}
}
}
using __IO::R::read; const int mod = 998244353, G = 3; namespace Math {
int x, y;
inline int pw(int base, int p) {
int res = 1;
for (; p; p >>= 1, base = static_cast<long long> (base) * base % mod) if (p & 1) res = static_cast<long long> (res) * base % mod;
return res;
}
void exgcd(int a, int b, int &x, int &y) {
if (!b) x = 1, y = 0;
else exgcd(b, a % b, y, x), y -= a / b * x;
}
inline int inv(int a) {
exgcd(a, mod, x, y);
return x + (x >> 31 & mod);
}
} #define N 262144
inline void reduce(int &a) {a += a >> 31 & mod;}
inline void clear(int *l, const int *r) {
if (l >= r) return ;
while (l != r) *l++ = 0;
} namespace Poly {
int lim, ilim, rev[N], s;
int Wn[N + 1];
inline void init(int n) {
s = -1, lim = 1; while (lim < n) lim <<= 1, s++; ilim = Math::inv(lim);
for (register int i = 0; i < lim; i++) rev[i] = rev[i >> 1] >> 1 | (i & 1) << s;
const int t = Math::pw(G, (mod - 1) / lim);
*Wn = 1; for (register int i = 1; i <= lim; i++) Wn[i] = static_cast<long long> (Wn[i - 1]) * t % mod;
}
void NTT(int *A, int op = 1) {
for (register int i = 0; i < lim; i++) if (i < rev[i]) std::iter_swap(A + i, A + rev[i]);
for (register int mid = 1; mid < lim; mid <<= 1) {
const int t = lim / mid >> 1;
for (register int i = 0; i < lim; i += mid << 1) {
for (register int j = 0; j < mid; j++) {
const int W = op ? Wn[t * j] : Wn[lim - t * j];
const int X = A[i + j], Y = static_cast<long long> (A[i + j + mid]) * W % mod;
reduce(A[i + j] += Y - mod), reduce(A[i + j + mid] = X - Y);
}
}
}
if (!op) for (register int i = 0; i < lim; i++) A[i] = static_cast<long long> (A[i]) * ilim % mod;
}
int C[N];
void INV(int *A, int *B, int n) {
if (n == 1) {
*B = Math::inv(*A);
return ;
}
INV(A, B, n + 1 >> 1);
std::copy(A, A + n, C);
init(n << 1), clear(C + n, C + lim);
NTT(B), NTT(C);
for (int i = 0; i < lim; i++) B[i] = (2 + mod - static_cast<long long> (C[i]) * B[i] % mod) * B[i] % mod;
NTT(B, 0);
clear(B + n, B + lim);
}
int D[N], E[N], F[N];
void DIV(int *A, int *B, int *Q, int n, int m) {
std::reverse_copy(A, A + n, D), std::reverse_copy(B, B + m, E);
clear(D + n - m + 1, D + n);
clear(E + n - m + 1, E + m);
INV(E, F, n - m + 1), init(n - m + 1 << 1);
NTT(D), NTT(F);
for (int i = 0; i < lim; i++) Q[i] = static_cast<long long> (D[i]) * F[i] % mod;
NTT(Q, 0);
std::reverse(Q, Q + n - m + 1);
for (int i = n - m + 1; i < lim; i++) Q[i] = 0;
}
int G[N];
void DIV_MOD(int *A, int *B, int *Q, int *R, int n, int m) {
DIV(A, B, Q, n, m);
std::copy(Q, Q + n - m + 1, G);
init(n << 1);
NTT(A), NTT(B), NTT(G);
for (int i = 0; i < lim; i++) R[i] = (A[i] + mod - static_cast<long long> (B[i]) * G[i] % mod) % mod;
NTT(R, 0);
}
} int A[N], B[N], Q[N], R[N];
int n, m;
int main() {
n = read() + 1, m = read() + 1;
for (int i = 0; i < n; i++) A[i] = read();
for (int i = 0; i < m; i++) B[i] = read();
Poly::DIV_MOD(A, B, Q, R, n, m);
for (int i = 0; i < n - m + 1; i++) printf("%d ", Q[i]); puts("");
for (int i = 0; i < m - 1; i++) printf("%d ", R[i]); puts("");
return 0;
}
[洛谷P4512]【模板】多项式除法的更多相关文章
- 洛谷 P4512 [模板] 多项式除法
题目:https://www.luogu.org/problemnew/show/P4512 看博客:https://www.cnblogs.com/owenyu/p/6724611.html htt ...
- 洛谷.4512.[模板]多项式除法(NTT)
题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
- 洛谷.3803.[模板]多项式乘法(NTT)
题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...
- 洛谷.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\ ...
- 洛谷 P4238 [模板] 多项式求逆
题目:https://www.luogu.org/problemnew/show/P4238 看博客:https://www.cnblogs.com/xiefengze1/p/9107752.html ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 多项式求逆元详解+模板 【洛谷P4238】多项式求逆
概述 多项式求逆元是一个非常重要的知识点,许多多项式操作都需要用到该算法,包括多项式取模,除法,开跟,求ln,求exp,快速幂.用快速傅里叶变换和倍增法可以在$O(n log n)$的时间复杂度下求出 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
随机推荐
- springboot 常用依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...
- 关联分析FPGrowth算法在JavaWeb项目中的应用
关联分析(关联挖掘)是指在交易数据.关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式.关联.相关性或因果结构.关联分析的一个典型例子是购物篮分析.通过发现顾客放入购物篮中不同商品之 ...
- JS里点击事件判断是否 触发了节点 和给标签添加class属性
$("#activityType").click(function(e){ if(e.target==$("#bb")[0]){ var bb=document ...
- GIT: 分布式开发 代码管理工具使用命令大全
代码管理工具: GIT 什么是GIT? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目 Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常 ...
- Python全栈 项目(HTTPServer、PiP使用)
pip是Python官方推荐的包管理工具 属于python的一部分 pip的使用 pip的安装 sudo apt-get install pyt ...
- Linux文件系统简介和软链接和硬链接的区别
Linux有着极其丰富的文件系统,大体可分为如下几类: 网络文件系统:如nfs.cifs等: 磁盘文件系统:如ext3.ext4等: 特殊文件系统:如prco.sysfs.ramfs.tmpfs等: ...
- chorme打开网页的技巧
恢复之前关闭的网页 ctr l+ shift + t 打开之前不小心关闭的网页 临时书签 在设置书签中有 为打开的网页添加书签 的选项, 清除地址栏搜索记录 首先需要退出个人谷歌账户,账户上的搜索记录 ...
- selenium常用操作方法
Webdriver中比较常用的操作元素的方法: clear() 清除输入框的默认内容 send_keys("xxx") 在一个输入框里输入xx内容 ——如果输入中文,则需要在脚本开 ...
- 幸运的袋子(深度优先遍历(Depth First Search,DFS))
题目描述 一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的).如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积. 例如:如果袋子里面的球的号码是{1, 1, 2 ...
- ajax获取动态列表数据后的分页问题
ajax获取动态列表数据后的分页问题 这是我在写前台网站时遇到的一个分页问题,由于数据是通过ajax的方式来请求得到的,如果引入相应的js文件来做分页,假如只是静态的填放数据到列表各项内容中(列表条数 ...