求 $F(x)=Q(x)\times G(x)+R(x)$  中的 $Q(x),R(x)$
 
$F(\frac{1}{x})=Q(\frac{1}{x})\times G(\frac{1}{x}) + R(\frac{1}{x})$
 
$x^{n}F(\frac{1}{x})=x^{n-m}Q(\frac{1}{x})x^{m}G(\frac{1}{x})+x^{n-m+1}x^{m-1}R(\frac{1}{x})$
 
带入 $\frac{1}{x}$,再乘以 $x^{n}$ 其实就是将系数翻转了
 
令 $F_{R}$ 表示将 $F$ 翻转
 
$F_{R}(x)=Q_{R}(x)G_{R}(x)+x^{n-m+1}R_{R}(x)$
 
$F_{R}(x)\equiv Q_{R}(x)G_{R}(x)+x^{n-m+1}R_{R}(x)($mod $x^{n-m+1})$
 
$F_{R}(x)\equiv Q_{R}(x)\times G_{R}(x)$ (mod $x^{n-m+1}$) 
 
$Q_{R}(x)\equiv F_{R}(x)\times G_{R}^{-1}(x)$(mod $x^{n-m+1}$) 
 
这里一定要注意,对 $G_{R}$ 求逆时模的是 $x^{n-m+1}$,所以要先将 $G_{R}$ 的长度定为 $n-m+1$
$R(x)=F(x)-G(x)\times Q(x)$   
// luogu-judger-enable-o2
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstring>
#include <vector>
#define setIO(s) freopen(s".in","r",stdin)
typedef long long ll;
const int maxn=2100005;
const ll mod=998244353;
using namespace std;
inline ll qpow(ll base,ll k) {
ll tmp=1;
for(;k;k>>=1,base=base*base%mod)if(k&1) tmp=tmp*base%mod;
return tmp;
}
inline ll inv(ll a) { return qpow(a, mod-2); }
inline void NTT(ll *a,int len,int flag) {
for(int i=0,k=0;i<len;++i) {
if(i>k) swap(a[i],a[k]);
for(int j=len>>1;(k^=j)<j;j>>=1);
}
for(int mid=1;mid<len;mid<<=1) {
ll wn=qpow(3, (mod-1)/(mid<<1)),x,y;
if(flag==-1) wn=qpow(wn,mod-2);
for(int i=0;i<len;i+=(mid<<1)) {
ll w=1;
for(int j=0;j<mid;++j) {
x=a[i+j],y=w*a[i+j+mid]%mod;
a[i+j]=(x+y)%mod, a[i+j+mid]=(x-y+mod)%mod;
w=w*wn%mod;
}
}
}
if(flag==-1) {
int re=qpow(len,mod-2);
for(int i=0;i<len;++i) a[i]=a[i]*re%mod;
}
}
ll A[maxn],B[maxn];
struct poly {
vector<ll>a;
int len;
poly(){}
inline void clear() { len=0; a.clear(); }
inline void rev() {reverse(a.begin(), a.end()); }
inline void push(int x) { a.push_back(x),++len; }
inline void resize(int x) { len=x; a.resize(x); }
void getinv(poly &b,int n) {
if(n==1) { b.clear(); b.push(inv(a[0])); return; }
getinv(b,n>>1);
int t=n<<1,lim=min(len,n);
for(int i=0;i<lim;++i) A[i]=a[i];
for(int i=lim;i<t;++i) A[i]=0;
for(int i=0;i<b.len;++i) B[i]=b.a[i];
for(int i=b.len;i<t;++i) B[i]=0;
NTT(A,t,1),NTT(B,t,1);
for(int i=0;i<t;++i) A[i]=(2-A[i]*B[i]%mod+mod)*B[i]%mod;
NTT(A,t,-1);
b.clear();
for(int i=0;i<n;++i) b.push(A[i]);
}
poly Inv() {
int n=1;
while(n<=len)n<<=1;
poly b;
b.clear(), getinv(b,n);
return b;
}
poly operator * (const poly &b) const {
int n=1;
while(n<=len+b.len) n<<=1;
for(int i=0;i<len;++i) A[i]=a[i];
for(int i=len;i<n;++i) A[i]=0;
for(int i=0;i<b.len;++i) B[i]=b.a[i];
for(int i=b.len;i<n;++i) B[i]=0;
NTT(A,n,1), NTT(B,n,1);
for(int i=0;i<n;++i) A[i]=A[i]*B[i]%mod;
NTT(A,n,-1);
poly c;
c.clear();
for(int i=0;i<len+b.len-1;++i) c.push(A[i]);
return c;
}
poly operator + (const poly &b) const {
poly c;
c.clear();
for(int i=0;i<len;++i) c.push(a[i]);
for(int i=0;i<b.len;++i) {
if(i<len) c.a[i]=(c.a[i]+b.a[i])%mod;
else c.push(b.a[i]);
}
return c;
}
poly operator - (const poly &b) const {
poly c;
c.clear();
for(int i=0;i<len;++i) c.push(a[i]);
for(int i=0;i<b.len;++i) {
if(i<len) c.a[i]=(c.a[i]-b.a[i]+mod)%mod;
else c.push((mod-b.a[i])%mod);
}
return c;
}
friend poly operator / (poly f,poly g) {
poly Q;
int l=f.len-g.len+1;
f.rev(), g.rev(), g.resize(l), f.resize(l);
g=g.Inv(), Q=f*g, Q.resize(l),Q.rev();
return Q;
}
friend poly operator % (poly f,poly g) {
poly u=f-(f/g)*g;
u.resize(g.len-1);
return u;
}
}po[4];
inline void inv() {
int n,x;
scanf("%d",&n), po[0].clear();
for(int i=0;i<n;++i) scanf("%d",&x), po[0].push(x);
po[1]=po[0].Inv();
for(int i=0;i<po[1].len;++i) printf("%lld ",po[1].a[i]);
}
inline void mult() {
int n,m,x;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;++i) scanf("%d",&x), po[0].push(x);
for(int i=0;i<=m;++i) scanf("%d",&x), po[1].push(x);
po[1]=po[0]*po[1];
for(int i=0;i<po[1].len;++i) printf("%lld ",po[1].a[i]);
}
inline void divide() {
int n,m,x;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;++i) scanf("%d",&x), po[0].push(x);
for(int i=0;i<=m;++i) scanf("%d",&x), po[1].push(x);
po[2]=po[0]/po[1];
for(int i=0;i<po[2].len;++i) printf("%lld ",po[2].a[i]);
printf("\n");
po[2]=po[0]%po[1];
for(int i=0;i<po[2].len;++i) printf("%lld ",po[2].a[i]);
}
int main() {
// setIO("input");
divide();
return 0;
}

  

luoguP4512 【模板】多项式除法 NTT+多项式求逆+多项式除法的更多相关文章

  1. FFT模板 生成函数 原根 多项式求逆 多项式开根

    FFT #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> ...

  2. BZOJ 3625 [Codeforces Round #250]小朋友和二叉树 ——NTT 多项式求逆 多项式开根

    生成函数又有奇妙的性质. $F(x)=C(x)*F(x)*F(x)+1$ 然后大力解方程,得到一个带根号的式子. 多项式开根有解只与常数项有关. 发现两个解只有一个是成立的. 然后多项式开根.求逆. ...

  3. 牛顿迭代,多项式求逆,除法,开方,exp,ln,求幂

    牛顿迭代 若 \[G(F_0(x))\equiv 0(mod\ x^{2^t})\] 牛顿迭代 \[F(x)\equiv F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}(mod ...

  4. [模板]多项式全家桶小记(求逆,开根,ln,exp)

    前言 这里的全家桶目前只包括了\(ln,exp,sqrt\).还有一些类似于带余数模,快速幂之类用的比较少的有时间再更,\(NTT\)这种前置知识这里不多说. 还有一些基本的导数和微积分内容要了解,建 ...

  5. NTT+多项式求逆+多项式开方(BZOJ3625)

    定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\fr ...

  6. 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln

    题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...

  7. 2019.01.01 bzoj3625:小朋友和二叉树(生成函数+多项式求逆+多项式开方)

    传送门 codeforces传送门codeforces传送门codeforces传送门 生成函数好题. 卡场差评至今未过 题意简述:nnn个点的二叉树,每个点的权值KaTeX parse error: ...

  8. 【BZOJ3625】【codeforces438E】小朋友和二叉树 生成函数+多项式求逆+多项式开根

    首先,我们构造一个函数$G(x)$,若存在$k∈C$,则$[x^k]G(x)=1$. 不妨设$F(x)$为最终答案的生成函数,则$[x^n]F(x)$即为权值为$n$的神犇二叉树个数. 不难推导出,$ ...

  9. bzoj 3456 城市规划——分治FFT / 多项式求逆 / 多项式求ln

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 分治FFT: 设 dp[ i ] 表示 i 个点时连通的方案数. 考虑算补集:连通的方 ...

随机推荐

  1. 路飞学城Python-Day78

    17-静态文件配置1 静态的文件的配置不能直接将CSS.JS文件直接放在templates的文件夹中 要将所有的静态文件放在static的文件夹中,然后配置上静态文件static的路径 要想访问Dja ...

  2. Day 12 闭包函数,装饰器

    闭包函数 回顾: 1.函数对象:可以将定义在函数内的函数返回到全局使用.从而打破了函数层级限制 2.名称空间与作用域:作用域关系在函数定义阶段时就已经固定死了,与调用位置无关,即在任意位置调用函数都需 ...

  3. POJ2406A- Power Strings

    Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...

  4. HDU3236 Gift Hunting

    /* HDU3236 Gift Hunting http://acm.hdu.edu.cn/showproblem.php?pid=3236 dp 滚动数组 * * */ #include <c ...

  5. Ajax发送XML请求案例

    Ajax发送XML请求需求: 根据输入的国家,输出这些国家下面的城市. 如果请求参数较多,而且请求参数的结构关系复杂,则可以考虑发送XML请求.XML请求的实质还是POST请求,只是在发送请求的客户端 ...

  6. yii 正则验证

    required : 必须值验证属性 [['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredV ...

  7. 洛谷 U3346 A1-偶回文数

    U3346 A1-偶回文数 题目背景 方方方很喜欢回文数,于是zzq就出了一道关于回文数的题目. 因为偶回文数比较简单,所以方方方就把它放在了第一题... 题目描述 我们定义一个长度为偶数的回文数叫做 ...

  8. pl/sql输入括号后卡顿的解决方式

    pl/sql输入括号后卡顿的解决方式 学习了:https://zhidao.baidu.com/question/298275368.html 工具->首选项->用户界面->代码助手 ...

  9. Android error--No implementation found for native Lcomd

    在利用NDK编译Cpp执行时,出现了No implementation found for native Lcom等错误,调试好久,才发现 XXX.h和XXX.cpp.在XXX.cpp里#includ ...

  10. spark视频教程免费下载

    下载地址:点我下载   其它章节陆续上传中,Hadoop视频教程正在整理中,敬请关注.