P4512 【模板】多项式除法
题意:多项式除法,A(x)=C(x)*B(x)+D(x),给定A(x),B(x),求C(x),D(x)
题解:A(x)的度是n,B(x)的度是m
定义\(A'(x)=x^n*A(\frac{1}{x})\),可以发现\(A'(x)=A(n-x)\)
\(A(\frac{1}{x})=C(\frac{1}{x})*B(\frac{1}{x})+D(\frac{1}{x})\)
\(x^nA(\frac{1}{x})=x^{n-m}*C(\frac{1}{x})*x^{m}*B(\frac{1}{x})+x^{n-m+1}*x^{m}D(\frac{1}{x})\)
\(A'(x)=C'(x)*B'(x)+x^{n-m+1}*D'(x)\)
那么我们考虑在\(mod(x^{n-m+1})\)的等式,即可消去D'(x)
这样我们便可求出\(C'(x)=\frac{A'(x)}{B'(x)}(mod(x^{n-m+1}))\),用多项式求逆,再回退C,带入可求出D
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize(4)
//#pragma GCC optimize("unroll-loops")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#define fi first
#define se second
#define db double
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 998244353
#define ld long double
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
//#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define fin freopen("a.txt","r",stdin)
#define fout freopen("a.txt","w",stdout)
#define fio ios::sync_with_stdio(false);cin.tie(0)
template<typename T>
inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>
inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;}using namespace std;const double eps=1e-8;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=300000+10,maxn=400000+10,inf=0x3f3f3f3f;ll a[N<<3],b[N<<3],c[N<<3],d[N<<3],e[N<<3],tmp[N<<3];
int rev[N<<3];
void getrev(int bit)
{for(int i=0;i<(1<<bit);i++)rev[i]=(rev[i>>1]>>1) | ((i&1)<<(bit-1));
}
void ntt(ll *a,int n,int dft)
{for(int i=0;i<n;i++)if(i<rev[i])swap(a[i],a[rev[i]]);for(int step=1;step<n;step<<=1){ll wn=qp(3,(mod-1)/(step*2));if(dft==-1)wn=qp(wn,mod-2);for(int j=0;j<n;j+=step<<1){ll wnk=1;for(int k=j;k<j+step;k++){ll x=a[k];ll y=wnk*a[k+step]%mod;a[k]=(x+y)%mod;a[k+step]=(x-y+mod)%mod;wnk=wnk*wn%mod;}}}if(dft==-1){ll inv=qp(n,mod-2);for(int i=0;i<n;i++)a[i]=a[i]*inv%mod;}
}
void pol_inv(int deg,ll *a,ll *b)
{if(deg==1){b[0]=qp(a[0],mod-2);return ;}pol_inv((deg+1)>>1,a,b);int sz=0;while((1<<sz)<=deg)sz++;sz++;getrev(sz);int len=1<<sz;for(int i=0;i<deg;i++)tmp[i]=a[i];for(int i=deg;i<len;i++)tmp[i]=0;ntt(tmp,len,1),ntt(b,len,1);for(int i=0;i<len;i++)b[i]=(2ll-tmp[i]*b[i]%mod+mod)%mod*b[i]%mod;ntt(b,len,-1);for(int i=deg;i<len;i++)b[i]=0;
}
void pol_div(int n,int m,ll *a,ll *b,ll *c,ll *d)
{for(int i=0;i<=n-m;i++)if(m>=i)c[i]=b[m-i];int sz=0;while((1<<sz)<=MAX(n-m+1,m))sz++;sz++;int len=1<<sz;pol_inv(len,c,d);for(int i=0;i<=n-m;i++)c[i]=a[n-i];for(int i=n-m+1;i<len;i++)c[i]=d[i]=0;getrev(sz);ntt(c,len,1);ntt(d,len,1);for(int i=0;i<len;i++)c[i]=c[i]*d[i]%mod;ntt(c,len,-1);reverse(c,c+n-m+1);for(int i=n-m+1;i<len;i++)c[i]=0;sz=0;while((1<<sz)<=n+1)sz++;sz++;len=1<<sz;getrev(sz);ntt(c,len,1);ntt(b,len,1);for(int i=0;i<len;i++)d[i]=c[i]*b[i]%mod;ntt(d,len,-1);ntt(c,len,-1);for(int i=0;i<len;i++)d[i]=(a[i]-d[i]+mod)%mod;for(int i=m;i<len;i++)d[i]=0;
}
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=0;i<=n;i++)scanf("%lld",&a[i]);for(int i=0;i<=m;i++)scanf("%lld",&b[i]);pol_div(n,m,a,b,c,d);for(int i=0;i<=n-m;i++)printf("%lld ",c[i]);puts("");for(int i=0;i<m;i++)printf("%lld ",d[i]);puts("");return 0;
}
/********************
5 1
1 9 2 6 0 8
1 7
********************/
转载于:https://www.cnblogs.com/acjiumeng/p/9530479.html
P4512 【模板】多项式除法相关推荐
- luogu P4512 多项式除法 (模板题、FFT、多项式求逆)
luogu P4512 多项式除法 (模板题.FFT.多项式求逆) 手动博客搬家: 本文发表于20181206 14:42:53, 原地址https://blog.csdn.net/suncongbo ...
- 【学习笔记】超简单的多项式除法(含完整证明)
整理的算法模板合集: ACM模板 目录 多项式除法 P4512 [模板]多项式除法 tips 还没调出来的vector版本代码 点我看多项式全家桶(●^◡_◡◡^●) 多项式除法 P4512 [模板 ...
- 多项式——多项式除法
多项式--多项式除法 给定一个 nnn 次多项式 A(x)A(x)A(x) 和一个 mmm 次多项式 B(x)B(x)B(x) ,请求出多项式 D(x)D(x)D(x), R(x)R(x)R(x),满 ...
- 多项式算法7:多项式除法
多项式算法7:多项式除法 多项式除法 前置知识: FFT NTT 多项式求逆 多项式除法 算法简述: 给定多项式FFF , GGG求出多项式RRR,QQQ使得F=G×Q+RF=G \times Q + ...
- deconv--反褶积和多项式除法
[功能简介]求向量反褶积和进行多项式除法运算. [语法格式] [q,r]=deconv(v,u) 参数q和r分别返回多项式v除以多项式u的商多项式和余多项式. [实例3.33]求多项式(x2+2x+1 ...
- 多项式除法,多项式取模
多项式除法 给定一个nnn次多项式F(x)F(x)F(x)和mmm次多项式G(x)G(x)G(x),要求R(x),Q(x)R(x), Q(x)R(x),Q(x),满足F(x)=R(x)G(x)+Q(x ...
- C++多项式除法的探讨
最近的一项工作就是用vector实现多项式类,这个类需要完成多项式的数据结构的定义以及基本运算,包括加减乘除,前三个还比较容易,对于多项式的除法,因为有除不尽的情况,比如: 计算 其结果是: 明显是除 ...
- PTA L2-018 多项式A除以B (多项式除法)
L2-018 多项式A除以B (25 分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给 ...
- 基于MATLAB 2014b的多项式除法程序
多项式运算所涉及的函数见下表 conv 实现卷积和多项式乘法 deconv 实现去卷积和多项式除法 poly 求具有指定根的多项式 polyder 多项式求导 polyeig 求多项式的特征值 pol ...
最新文章
- 南京、苏州、杭州、上海你更喜欢哪座城市?
- mysql 主从 网络异常_mysql主从常见异常问题解决
- .NET中栈和堆的比较【转自:c#开发园地】
- 带有LLVM的eBPF组件
- 2018农行--软开
- 解决可视化界面的时候灰屏【已解决】
- 透明FLASH的插入方法
- QT 使用全局钩子监听鼠标事件和键盘事件
- NSSA区域和Totally NSSA区域
- 苹果手机又刷屏啦!!它是如何做到的?
- 智慧物流在大宗货运领域“落地”有多难?
- 如何抠图人像换背景?教你一个在线操作的方法
- 【问题处理】Word修改页边距后,目录没有右对齐
- JS - Jquery 利用cookie 实现本地收藏功能,不重复无需多次命名
- 2015年7月30日工作总结
- UDP数据包协议格式详解
- python自动化配置路由器_H3C MSR 系列路由器 配置指导(V7)-R0304-6W105
- 服务器托管和虚拟主机区别,虚拟主机和托管主机的区别是什么
- 对塑料瓶无知真是害死人
- 阿里云APP软件著作权在线登记步骤?