多项式全家桶(一):多项式的加,减,卷积

         \ \ \ \ \ \ \,       多项式的加,减,卷积,是比较基本的多项式操作,以模拟和 N T T NTT NTT 为主,主要是展示和记录模板的操作。

         \ \ \ \ \ \ \,        单项式其实就是常数。


1. 多项式加,减单项式

inline Polynomial operator +(const Polynomial &a,const int &b){
	int sizea=a.size();Polynomial ret=a;ret.resize(sizea);
	for(int i=0;i<sizea;i++)ret[i]=(1ll*a[i]+b+mod)%mod;
	return ret;
}
inline Polynomial operator -(const Polynomial &a,const int &b){
	int sizea=a.size();Polynomial ret=a;ret.resize(sizea);
	for(int i=0;i<sizea;i++)ret[i]=(1ll*a[i]-b+mod)%mod;
	return ret;
}

2. 多项式卷积单项式

inline Polynomial operator *(const Polynomial &a,const int &b){
	int sizea=a.size();Polynomial ret=a;ret.resize(sizea);
	for(int i=0;i<sizea;i++)ret[i]=(1ll*a[i]*b%mod+mod)%mod;
	return ret;
}

3. 多项式加,减多项式

       &ThinSpace; \ \ \ \ \ \ \,       注意 v e c t o r vector vector 在赋值之前,一定先要 r e s i z e resize resize 到合适的位置,不然就会一直 R E RE RE 了。

inline Polynomial operator +(const Polynomial &a,const Polynomial &b){
	int sizea=a.size(),sizeb=b.size(),size=max(sizea,sizeb);
	Polynomial ret=a;ret.resize(size);
	for(int i=0;i<sizeb;i++)ret[i]=(1ll*ret[i]+b[i])%mod;
	return ret;
}
inline Polynomial operator -(const Polynomial &a,const Polynomial &b){
	int sizea=a.size(),sizeb=b.size(),size=max(sizea,sizeb);
	Polynomial ret=a;ret.resize(size);
	for(int i=0;i<sizeb;i++)ret[i]=(1ll*ret[i]-b[i]+mod)%mod;
	return ret;
}

4. 多项式卷积多项式

       &ThinSpace; \ \ \ \ \ \ \,       P3803 【模板】多项式乘法(FFT)(可以NTT过

inline Polynomial operator *(const Polynomial &a,const Polynomial &b){
	Polynomial lsa=a,lsb=b,ret;
	int n=lsa.size(),m=lsb.size();
	n=Prepare_Transformation(n+m);
  	lsa.resize(n);lsb.resize(n);ret.resize(n);
  	NTT(lsa,1);NTT(lsb,1);
  	for(int i=0;i<n;i++)ret[i]=1ll*lsa[i]*lsb[i]%mod;
  	NTT(ret,-1);return ret;
}

5. 多项式除法和取模

       &ThinSpace; \ \ \ \ \ \ \,       你问我多项式除法(P4512 【模板】多项式除法)???多项式除法滚出多项式全家桶!!!(超凶

       &ThinSpace; \ \ \ \ \ \ \,       看了下一篇 求逆 过后,应该可以自己完成多项式除法了,但是在很多小地方……容易自闭。

       &ThinSpace; \ \ \ \ \ \ \,       还是贴一下板子吧,小心别一开始二进制取整了:

inline Polynomial operator /(const Polynomial &a,const Polynomial &b){
	Polynomial ret=a,ls=b;
  	reverse(ret.begin(),ret.end());
  	reverse(ls.begin(),ls.end());
	ls.resize(Binary_Rounding(a.size()+b.size()));
	ls=Inverse(ls);
	ls.resize(a.size()+b.size());
	ret=ret*ls;ret.resize(a.size()-b.size()+1);
  	reverse(ret.begin(),ret.end());
	return ret;
}
inline Polynomial operator %(const Polynomial &a,const Polynomial &b){
	Polynomial ret=a/b;
	ret=ret*b;ret.resize(a.size()+b.size());
	ret=a-ret;ret.resize(a.size()+b.size());
	return ret;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值