文章目录

  • 问题
  • 思路
  • 代码

问题

现在给出 n n n 次多项式 A ( x ) A(x) A(x) 和 m m m 次多项式 B ( x ) B(x) B(x),求出它们的商 C ( x ) C(x) C(x) 和余数 D ( x ) D(x) D(x)。也就是说,找出 n − m n-m n−m 次多项式 C ( x ) C(x) C(x) 和次数小于 m m m 的多项式 D ( x ) D(x) D(x) 使得 A ( x ) = B ( x ) C ( x ) + D ( x ) A(x)=B(x)C(x)+D(x) A(x)=B(x)C(x)+D(x)。系数对 998244353 998244353 998244353 取模。

思路

先考虑求商。一个很自然的思路就是求出 B ( x ) B(x) B(x) 的乘法逆元再乘上 A ( x ) A(x) A(x),但我们发现这样求出来的结果是错误的,原因是这样的结果求出来后根本没有余数我们考虑把余数通过某种方式处理掉。
考虑式子 A ( x ) = B ( x ) C ( x ) + D ( x ) A(x)=B(x)C(x)+D(x) A(x)=B(x)C(x)+D(x),代入 1 x \frac 1 x x1​ 并两端乘上 x n x^n xn,则可以得到 x n A ( 1 x ) = x n B ( 1 x ) C ( 1 x ) + x n D ( 1 x ) x^nA(\frac 1 x)=x^nB(\frac 1 x)C(\frac 1 x)+x^nD(\frac 1 x) xnA(x1​)=xnB(x1​)C(x1​)+xnD(x1​)如果有 n n n 次多项式 F ( x ) F(x) F(x)(不足 n n n 次就补 0 0 0),不难发现把 F ( 1 x ) F(\frac 1 x) F(x1​) 乘上 x n x^n xn 相当于把 F ( x ) F(x) F(x) 的系数左右调转,得到的多项式记作 F R ( x ) F_R(x) FR​(x)。显然,它可以 O ( n ) O(n) O(n) 求出。
有了这个定义,上面的式子就可以简化为 A R ( x ) = B R ( x ) C R ( x ) + x n − m + 1 D R ( x ) A_R(x)=B_R(x)C_R(x)+x^{n-m+1}D_R(x) AR​(x)=BR​(x)CR​(x)+xn−m+1DR​(x)
A R ( x ) ≡ B R ( x ) C R ( x ) ( mod  x n − m + 1 ) A_R(x)\equiv B_R(x)C_R(x)\ (\text{mod}\ x^{n-m+1}) AR​(x)≡BR​(x)CR​(x) (mod xn−m+1)
这样余数的干扰就被排除,我们就可以用乘法逆元求出 C R ( x ) ≡ A R ( x ) ( B R ( x ) ) − 1 ( mod  x n − m + 1 ) C_R(x)\equiv A_R(x)(B_R(x))^{-1}\ (\text{mod}\ x^{n-m+1}) CR​(x)≡AR​(x)(BR​(x))−1 (mod xn−m+1)这个结果恰巧为 n − m n-m n−m 次多项式,再把它反过来就可以得到 C ( x ) C(x) C(x) 了。
现在求出了 C ( x ) C(x) C(x),余数就可以用 D ( x ) = A ( x ) − B ( x ) C ( x ) D(x)=A(x)-B(x)C(x) D(x)=A(x)−B(x)C(x) 求出来了。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define re register
#define ll long long
using namespace std;
ll mod=998244353,G[2]={332748118,3},inv;
ll A[450001],B[450001],invB[450001],D[450001];
ll f[450001],g[450001];
int rev[450001],m,n,lenA,lenB;
inline ll qp(ll a,int b){ll res=1ll;while(b){if(b&1) (res*=a)%=mod;(a*=a)%=mod;b>>=1;}return res;
}
ll w,w_n,x,y,z;
inline void NTT(ll *a,int flag){for(re int i=1;i<n;++i){if(rev[i]<i) swap(a[i],a[rev[i]]);}for(re int i=1;i<n;i<<=1){w_n=qp(G[flag],(mod-1)/(i<<1));for(re int j=0;j<n;j+=(i<<1)){w=1ll; z=i+j;for(re int k=j;k<z;++k){x=a[k];y=w*a[k+i]; if(y>=mod) y%=mod;a[k]=x+y; if(a[k]>=mod) a[k]-=mod;a[k+i]=x-y; if(a[k+i]<0) a[k+i]+=mod;w*=w_n; if(w>=mod) w%=mod;}}}if(!flag){inv=qp(n,mod-2);for(re int i=0;i<n;++i) (a[i]*=inv)%=mod;}return;
}
int main(){scanf("%d%d",&lenA,&lenB);for(re int i=0;i<=lenA;++i) scanf("%lld",&A[i]);for(re int i=lenB;i>=0;--i) scanf("%lld",&B[i]);  //直接反过来输入invB[0]=qp(B[0],mod-2);for(re int i=1;i<=lenA-lenB;i<<=1){n=(i<<2);m+=1; memset(g,0,sizeof(g));for(re int j=1;j<n;++j) rev[j]=((rev[j>>1]>>1)|((j&1)<<m));for(re int j=i-1;j<(i<<1);++j) f[j]=B[j];for(re int j=0;j<i;++j) g[j]=invB[j];NTT(f,1); NTT(g,1);for(re int j=0;j<n;++j) g[j]=(((g[j]*g[j])%mod)*f[j])%mod;NTT(f,0); NTT(g,0);for(re int j=i;j<(i<<1);++j) invB[j]=((invB[j]<<1)%mod-g[j]+mod)%mod;}  //求乘法逆元memset(f,0,sizeof(f)); memset(g,0,sizeof(g));for(re int i=0;i<=lenA-lenB;++i) f[i]=A[lenA-i];for(re int i=0;i<=lenA-lenB;++i) g[i]=invB[i];m=1; while((1<<m)<=((lenA-lenB)<<1)) m+=1; n=(1<<m);for(re int i=1;i<n;++i) rev[i]=((rev[i>>1]>>1)|((i&1)<<(m-1)));NTT(f,1); NTT(g,1);for(re int i=0;i<n;++i) (f[i]*=g[i])%=mod;  //得到 C_R(x)NTT(f,0);for(re int i=0;i<=lenA-lenB;++i) D[i]=f[lenA-lenB-i];for(re int i=0;i<=(lenB>>1);++i) swap(B[i],B[lenB-i]);m=1; while((1<<m)<=lenA) m+=1; n=(1<<m);for(re int i=1;i<n;++i) rev[i]=((rev[i>>1]>>1)|((i&1)<<(m-1)));NTT(B,1); NTT(D,1);for(re int i=0;i<n;++i) (B[i]*=D[i])%=mod;  //B(x)*D(x)NTT(B,0); NTT(D,0);for(re int i=0;i<=lenA-lenB;++i) printf("%lld ",D[i]);printf("\n");for(int i=0;i<lenB;++i){A[i]-=B[i];if(A[i]<0) A[i]+=mod;  //求解余数}for(re int i=0;i<lenB;++i) printf("%lld ",A[i]);printf("\n");return 0;
}

谢谢观看,记得点赞

多项式(带余)除法学习笔记相关推荐

  1. Emacs自带教程的学习笔记

    本篇文章是由学习GNU Emacs 24.5.1 (i686-pc-mingw32)版本自带的帮助教程而来. Emacs Tutorial 查看原文档的方式是: 打开Emacs, M-x help-w ...

  2. kali使用笔记本自带无线网卡_kali学习笔记之——wi read():Network is down问题

    众所周知,kali学的好,牢饭吃到饱(手动滑稽) 最近在学习kali渗透,莫得linux基础,所以踩了很多坑.昨天遇到了一个问题,百度上面没有,所以分享一下我的采坑记录和解决过程. 学习过kali系统 ...

  3. 「学习笔记」多项式的蛇皮操作

    文章目录 「学习笔记」多项式的蛇皮操作 前置知识 趋近 自然常数 对数 逆元 导函数 牛顿迭代与泰勒公式 不定积分与定积分 多项式乘法 多项式求逆元 多项式除法/取模 多项式牛顿迭代法 多项式开根 「 ...

  4. 【学习笔记】超简单的快速傅里叶变换(FFT)(含全套证明)

    整理的算法模板合集: ACM模板 目录 一.概念概述 二.前置知识 1. 多项式 2. 复数 4. 欧拉公式证明 3. 复数的单位根 / 单位向量 三.FFT 算法概述 四.离散傅里叶变换(DFT) ...

  5. 多项式相关操作学习笔记

    多项式相关操作学习笔记 标签: 多项式 说在前边 记录一下相关的多项式操作,顺便存个模板.(多点求值之后的部分,有点写不动了...留坑留坑 多项式 定义 给定一个环\(R\)(\(R\)通常是交换环, ...

  6. 取模(mod)与取余(rem)的区别——Matlab学习笔记

    取模(mod)与取余(rem)的区别--Matlab学习笔记http://www.bieryun.com/1099.html 昨天在学习Matlab的数学函数时,教程中提到取模(mod)与取余(rem ...

  7. MySQL基础学习笔记(带目录)

    MySQL学习笔记 MySQL产品的介绍和安装 MySQL服务的启动和停止 MySQL服务的登陆和退出 MySQL的常见命令 MySQL的语法规范 MySQL基础查询 1.起别名 2. 去重disti ...

  8. 飞浆PaddlePaddle-百度架构师手把手带你零基础实践深度学习(学习笔记)

    飞浆PaddlePaddle-百度架构师手把手带你零基础实践深度学习(学习笔记) 百度架构师手把手带你零基础实践深度学习(打卡学习笔记) 为什么学习飞浆PaddlePaddle,不得不说百度最近几年在 ...

  9. 影像组学视频学习笔记[44(End)]-带95%置信区间的折线图、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/971eeaa03ec9 来源:简书,已获授权转载 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(44)主要 ...

最新文章

  1. Cisco 设备设置监控口
  2. exp中query的使用方法
  3. RESET MASTER和RESET SLAVE使用场景和说明,以及清除主从同步关系
  4. 黄仁勋登上《时代周刊》2021年度全球具影响力人物
  5. 关于下一代IM服务器的一点想法
  6. python列表功能默写_初识 Python 作业及默写
  7. 《JavaScript高级程序设计(第四版)》红宝书学习笔记(2)(第四章:变量、作用域与内存)
  8. 【白皮书分享】2020全球数字治理白皮书.pdf(附下载链接)
  9. 数据库点滴积累——索引
  10. torch中permute()函数用法补充内容(矩阵维度变化详细过程)
  11. oracle 优化GROUP BY
  12. php开发工具 知乎,一个微信小程序版知乎实例分享
  13. C语言:二进制转换十进制
  14. 评论抓取:Python爬取AppStore上的评论内容及星级,突破500条限制
  15. HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第3章初识CSS
  16. 第一行代码 第三版 第11章网络技术 11.6.1 Retrofit 应用 报错:android.system.ErrnoException: isConnected failed: ECONNRE
  17. 基本图像变换:线性变换,仿射变换,投影变换
  18. 在外文paper写作中,英文杂志以及英文会议缩写名称怎么查找
  19. 移动端HTML开发(模仿京东移动端)
  20. 1.43 亿人信息被盗,整个美国都慌了;Linux 发行版 SUSE 诞生 25 周年

热门文章

  1. dec在oracle中,在SQL – Oracle中查找匹配的间隔
  2. 凯云水利水电工程造价管理系统 技术解析(七) 机械单价(二)
  3. 水果店营销技巧与方法,水果店营销模式和技巧
  4. MAC电脑迁移本机Notes
  5. NC平台 后台任务配置
  6. 从富文本(html字符串)中获取图片,js获取富文本中的第一张图片(正则表达式)
  7. WORD插入摄氏华氏度及换算
  8. AD10 绘制MARK点
  9. 一位研究生导师的肺腑之言
  10. 号码锁 Combination Lock [USACO1.4]