前言

emmm又是暂无


前置

多项式求逆


多项式除法/取模目的

还是跟之前一样顾名思义】

给定一个多项式F(x),请求出多项式Q(x)和R(x),满足F(x)=Q(x)∗G(x)+R(x),R项数小于G,系数对998244353取模。


多项式除法/取模主要思路

先考虑一个多项式的反转操作

就是一个多项式系数前后调换

定义这个反转的操作下标加个 R

显然FR(x)=xnF(1/x)

接着推式子

F(x)=Q(x)∗G(x)+R(x)

F(1/x)=Q(1/x)∗G(1/x)+R(1/x)

xnF(1/x)=xn-mQ(1/x)∗xmG(1/x)+xm-1xn-m+1R(1/x)

FR(x)=QR(x)*GR(x)+xn-m+1RR(x)

所以当FR(x)=QR(x)*GR(x)+xn-m+1RR(x)(mod xn-m+1)

等于FR(x)=QR(x)*GR(x)(mod xn-m+1)

那么QR(x)=GR(x)*FR(x)-1(mod xn-m+1)

这时求出FR(x)在模xn-m+1即可求出QR(x)

反转回来就可得Q(x)

通过R(x)=F(x)-Q(x)∗G(x)


代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define C getchar()-48
inline ll read()
{
ll s=,r=;
char c=C;
for(;c<||c>;c=C) if(c==-) r=-;
for(;c>=&&c<=;c=C) s=(s<<)+(s<<)+c;
return s*r;
}
const ll p=,G=,N=;
ll n,m;
ll f[N],g[N],q[N],r[N],inv[N],rev[N],c[N];
ll tmp1[N],tmp2[N];
inline ll ksm(ll a,ll b)//..快速幂
{
ll ans=;
while(b)
{
if(b&) ans=(ans*a)%p;
a=(a*a)%p;
b>>=;
}
return ans;
}
inline void ntt(ll *a,ll n,ll kd)//ntt日常操作
{
for(int i=;i<n;i++)
if(i<rev[i])
swap(a[i],a[rev[i]]);
for(int i=;i<n;i<<=)
{
ll gn=ksm(G,(p-)/(i<<));
for(int j=;j<n;j+=(i<<))
{
ll t1,t2,g=;
for(int k=;k<i;k++,g=g*gn%p)
{
t1=a[j+k],t2=g*a[j+k+i]%p;
a[j+k]=(t1+t2)%p,a[j+k+i]=(t1-t2+p)%p;
}
}
}
if(kd==) return;
ll ny=ksm(n,p-);
reverse(a+,a+n);
for(int i=;i<n;i++) a[i]=a[i]*ny%p;
}
inline void cl(ll *a,ll *b,ll n,ll m,ll len,ll w)//处理
{
for(int i=;i<len;i++) tmp1[i]=i<n?a[i]:;//复制 清空多余//因为tmp被使用多遍 而在做ntt时 用的是长度为len的
for(int i=;i<len;i++) tmp2[i]=i<m?b[i]:;//而有效的值只有它的得出的长度 后面其它的在模意义下都被清掉了 但之前在写的时候有的地方并没有清
//为了避免出错所以一定要清空 (在这个代码里)//..不要打成 i<n?tmp1[i]=a[i]:0;...只有像我这种蒟蒻才会犯这种错误吧
for(int i=;i<len;i++) rev[i]=(rev[i>>]>>)|((i&)<<(w-));//蝴蝶
}
inline void polyinv(ll *a,ll *b,ll ed)//递推版
{
b[]=ksm(a[],p-);//设初始值 a*b=1(mod=x)b的值
for(int k=,j=;k<=(ed<<);k<<=,j++)//从两个长度为k的多项式a,b递推
{//!!因为这份代码的递推算的是 两个长度为a的多项式在模(m^k)次下的逆元
//所以如果直接用ed为条件只会推出小于ed的逆元 所以ed要再乘一倍
//所以多项式总共需要的范围要为4倍所以N要4倍
ll len=k<<; //len 两式子计算后大小
cl(a,b,k,k,len,j+);//处理//j+1 要看len调整 因为len乘上了一倍 所以j在处理时也要加上1 之前没有加被坑了好久
ntt(tmp1,len,);ntt(tmp2,len,);//注意不要直接用a,b算 因为ntt后原多项式的值会变 为了方便所以先复制一遍在用复制的多项式算
for(int i=;i<len;i++) b[i]=tmp2[i]*(2ll-tmp1[i]*tmp2[i]%p+p)%p;//求逆
ntt(b,len,-);
for(int i=k;i<len;i++) b[i]=;//清空会被模的 //!!!不能删 因为下次递推是直接把0--len都作为有用的做下次运算了
}
}
inline void polymul(ll *a,ll *b,ll *c,ll n,ll m)//计算多项式相乘
{
ll len=,w=;
while(len<=(n+m)) len<<=,w++;
cl(a,b,n,m,len,w);//这里的次数(w)不用加1因为两者都是同不改变的
ntt(tmp1,len,);ntt(tmp2,len,);
for(int i=;i<len;i++) c[i]=tmp1[i]*tmp2[i]%p;
ntt(c,len,-);
}
inline void work() //f=q*g+r ask q,r f,g下标从0--n,0--m
{ reverse(f,f++n);//对应各式的反转操作
reverse(g,g++m); polyinv(g,inv,n-m+);//求逆 因为反转后使r能够被忽略所以是在模x^(n-m+1)意义下的, 所以只要算出g在模x^(n-m+1)下的逆元
polymul(f,inv,q,n+,n-m+);//计算q reverse(q,q+n-m+);//将原式反转回来
reverse(f,f+n+);
reverse(g,g+m+); polymul(g,q,r,m+,n-m+);//计算q*g的值
for(int i=;i<m;i++) r[i]=(f[i]-r[i]+p)%p;//相减算出r
}
int main()//注意输入的多项式是 0--n 和0--m 不是长度为n,m;
{
n=read(),m=read(); //读入
for(int i=;i<=n;i++) f[i]=read();
for(int i=;i<=m;i++) g[i]=read();
work();
for(int i=;i<=n-m;i++) printf("%lld ",q[i]);printf("\n");//输出
for(int i=;i<m;i++) printf("%lld ",r[i]);
return ;
}

Re.多项式除法/取模的更多相关文章

  1. 除法取模练习(51nod 1119 & 1013 )

    题目:1119 机器人走方格 V2 思路:求C(m+n-2,n-1) % 10^9 +7       (2<=m,n<= 1000000) 在求组合数时,一般都通过双重for循环c[i][ ...

  2. HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)

    传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/detai ...

  3. 51nod1119(除法取模)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119 题意:中文题诶- 思路:这题数据比较大直接暴力肯定是不 ...

  4. 51nod1119(除法取模/费马小定理求组合数)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119 题意:中文题诶- 思路:这题数据比较大直接暴力肯定是不 ...

  5. hdu 3037 费马小定理+逆元除法取模+Lucas定理

    组合数学推推推最后,推得要求C(n+m,m)%p 其中n,m小于10^9,p小于1^5 用Lucas定理求(Lucas定理求nm较大时的组合数) 因为p数据较小可以直接阶乘打表求逆元 求逆元时,由费马 ...

  6. 51nod 1013 3的幂的和 - 快速幂&除法取模

    题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1013 Konwledge Point: 快速幂:https:/ ...

  7. HDU 4633 Who's Aunt Zhang ★(Polya定理 + 除法取模)

    题意 用K个颜色给魔方染色,魔方只能整体旋转并且旋转重合的方案算一种,求一共有多少不同的染色方案. 思路 经典的Polya应用,记住正六面体的置换群就可以了,魔方就是每个大面变成9个小面了而已: 本题 ...

  8. 洛谷.4512.[模板]多项式除法(NTT)

    题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...

  9. 组合数取模Lucas定理及快速幂取模

    组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1)  , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...

随机推荐

  1. C# xml序列化与反序列化 特性的使用

    以下为将被序列化的类Entity: [XmlRoot("Root")] public class Entity { [XmlAttribute(AttributeName = &q ...

  2. 设计模式 - 单例模式(Singleton Pattern)

    单例模式 介绍 模式:创建型 意图:保证一个类只有一个实例,并提供一个访问它的全局访问点 解决:一个全局使用的类频繁地创建与销毁 场景: 唯一序列号 web中的计数器 I/O与数据库的连接 …… 实现 ...

  3. SD 笔记01

    sap组织结构:代表一个企业的组织视图的结构.根据业务处理,可以设置自己工时的结构.形成一个支持所有业务活动的框架. 集团公司代码销售区域 :销售组织.销售渠道.产品组:工厂库存地点装运地点 集团:c ...

  4. 微信小程序 canvas 文字自动换行

    Page({ drawCanvas: function(ctx) {// 地址 ctx.setFontSize() ctx.setFillStyle('#9E7240') ctx.textAlign= ...

  5. vuex最简单、最直白、最全的入门文档

    前言 我们经常用element-ui做后台管理系统,经常会遇到父组件给子组件传递数据,下面一个简单的例子,点击按钮,把弹框显示变量数据通过子组件的props属性传递,子组件通过$emit事件监听把数据 ...

  6. (详细)华为荣耀4X CHE-TL00H的usb调试模式在哪里打开的步骤

    每当我们使用PC通过数据线链上安卓手机的时候,如果手机没有开启usb开发者调试模式,PC则没能成功读到我们的手机,有时,我们使用的一些功能较强的工具好比之前我们使用的一个工具引号精灵,老版本就需要打开 ...

  7. Maven deploy部署jar包到远程私仓

    Maven deploy部署jar包到远程私仓 maven deploy介绍 maven中的仓库分为两种,snapshot快照仓库和release发布仓库.snapshot快照仓库用于保存开发过程中的 ...

  8. HTML语义化的理解

    语义化的主要目的:用正确的标签做正确的事情. 语义化验证方法:css裸奔--去掉css样式,然后看页面是否还具有很好的可读性. 语义化意义 / 优点: 1.让页面的内容结构化 2.利于浏览器解析和SE ...

  9. SimpleDateFormat日期格式化总结

    1.new一个java.util.Date对象,调用它的setYear.setMonth等等方法,设置你要的年月日.不过这种做法不推荐,因为setYear等方法已经过时了.2.new一个java.ut ...

  10. 基本MVVM 和 ICommand用法举例(转)

    引言 在本贴中,我们将学习WPF Commands. Commands 可以很好地与 MVVM 模式 (Model- View-ViewModel)结合在一起.我们也将看到,视图(view)实际上是怎 ...