首页 > 其他分享 >pp_orange 的新poly模版

pp_orange 的新poly模版

时间:2024-03-06 23:12:00浏览次数:24  
标签:pp const int len return poly orange rlt

点击查看代码
namespace Poly{
int *r[23];
int rr[MAX<<1];
struct polyinit{
	polyinit(){
		int nw = 1;
		int len = 1;
		while(nw+len<=(MAX<<1)){
			int pos = lg(len);
			r[pos] = rr+nw;
			rep(i,1,len)r[pos][i] = (r[pos][i>>1]>>1)|((i&1)<<(pos-1));
			nw += len;
			len <<= 1;
		}
	}
}polyinit;
template <class T = mint>
struct poly{
	vT a;
	T G=3,Gi=G.inv();
	int len = 0;
	poly(){}
	explicit poly(int Len){len = Len;a.resize(Len);}
	poly(vT v){len=v.size();a = v;}
	T & operator [] (int x){return a[x];}
	void set(int x){
		len = 1;
		a.resize(1);
		a[0] = x;
		return ;
	}
	const poly<T> operator % (const int Len)const {
		poly<T> rlt;
		rlt.len = Len;
		if(Len>=len){rlt.a=a;rlt.a.resize(Len);}
		else rlt.a.assign(a.begin(),a.begin()+Len);
		return rlt;
	}
	poly<T> & operator %= (const int Len)
	{a.resize(Len);len = Len;return *this;}
	const poly<T> operator << (int x)const {
		poly<T> rlt(len+x);
		rep(i,x,len+x)rlt[i] = a[i-x];
		return rlt;
	}
	poly<T> & operator <<= (int x){return *this=*this<<x;}
	const poly<T> operator >> (int x)const {
		poly<T> rlt(len-x);
		rep(i,0,x)assert(a[i]==T(0));
		rep(i,x,len)rlt[i-x] = a[i];
		return rlt;
	}
	poly<T> & operator >>= (int x){return *this=*this>>x;}
	const bool operator < (const poly b)const {assert(false);return 0;}
	const bool operator > (const poly b)const {assert(false);return 0;}
	const bool empty()const {return a[0].empty();}
	const poly<T> operator + (poly<T> b)const {
		poly<T> rlt = *this;
		rlt %= max(len,b.len);
		rep(i,0,b.len)rlt[i] += b[i];
		return rlt;
	}
	poly<T> & operator += (poly<T> b){
		*this %= max(len,b.len);
		rep(i,0,b.len)a[i] += b[i];
		return *this;
	}
	const poly<T> operator - (poly<T> b)const {
		poly<T> rlt = *this;
		rlt %= max(len,b.len);
		rep(i,0,b.len)rlt[i] -= b[i];
		return rlt;
	}
	poly<T> & operator -= (poly<T> b){
		*this %= max(len,b.len);
		rep(i,0,b.len)a[i] -= b[i];
		return *this;
	}
	T operator () (T x)const {
		T rlt; rlt.set(0);
		T w; w.set(0);
		rep(i,0,len){rlt += w*a[i];w *= x;}
		return rlt;
	}
	void NTT(int N=1){
		while(N<len)N <<= 1;
		*this %= N;
		int pos = lg(N);
		rep(i,0,N)if(r[pos][i]<i)swap(a[r[pos][i]],a[i]);
		a.resize(N);
		T x,y,w,omg;
		for(int mid=1;mid<N;mid<<=1){
			omg = pw(G,(mod-1)/(mid<<1));
			for(int i=0;i<N;i+=(mid<<1)){
				w = 1;
				rep(j,i,i+mid){
					x = a[j];y = a[j+mid]*w;
					a[j] = x+y;a[j+mid] = x-y;
					w *= omg;
				}
			}
		}
		return ;
	}
	void INTT(int N=1){
		while(N<len)N <<= 1;
		*this %= N;
		int pos = lg(N);
		rep(i,0,N)if(r[pos][i]<i)swap(a[r[pos][i]],a[i]);
		T x,y,w,omg;
		for(int mid=1;mid<N;mid<<=1){
			omg = pw(Gi,(mod-1)/(mid<<1));
			for(int i=0;i<N;i+=(mid<<1)){
				w = 1;
				rep(j,i,i+mid){
					x = a[j];y = a[j+mid]*w;
					a[j] = x+y;a[j+mid] = x-y;
					w *= omg;
				}
			}
		}
		return ;
	}
	const poly<T> operator * (poly<T> b)const {
		poly<T> c = *this;
		int N = 1;
		int Len = len+b.len-1;
		while(N<Len)N <<= 1;
		c.NTT(N);b.NTT(N);
		T Ni = T(N).inv();
		rep(i,0,N)c[i] *= b[i]*Ni;
		c.INTT(N);
		c %= Len;
		return c;
	}
	poly<T> & operator *= (poly<T> b){
		int Len = len+b.len-1;
		int N = 1;
		while(N<Len)N <<= 1;
		this->NTT(N);b.NTT(N);
		T Ni = T(N).inv();
		rep(i,0,N)a[i] *= b[i]*Ni;
		this->INTT(N);
		*this %= Len;
		return *this;
	}
	const poly<T> operator * (T b)const {
		poly rlt(len);
		rep(i,0,len)rlt[i] = a[i]*b;
		return rlt;
	}
	poly<T> & operator *= (T b){
		rep(i,0,len)a[i] *= b;
		return *this;
	}
	const poly<T> inv_iter(const poly<T> &f)const
	{return (*this)*(poly(vT{2})-(*this)*(f%(len*2)))%(len*2);}
	const poly<T> inv(int n)const {
		int N = 1;
		poly<T> rlt(1);
		rlt[0] = a[0].inv();
		while(N<n){
			rlt = rlt.inv_iter(*this);
			N <<= 1;
		}
		rlt %= n;
		return rlt;
	}
	poly<T> & deSelf(){
		rep(i,0,len-1)a[i] = a[i+1]*T(i+1);
		*this %= len-1;
		return *this;
	}
	const poly<T> de()const {
		poly<T> rlt(len-1);
		rep(i,0,len-1)rlt[i] = a[i+1]*T(i+1);
		return rlt;
	}
	poly<T> &interSelf(){
		*this %= len+1;
		per(i,len,1)a[i] = a[i-1]*idig[i];
		a[0] = 0;
		return *this;
	}
	const poly<T> inter()const {
		poly<T> rlt(len+1);
		per(i,len+1,1)rlt[i] = a[i-1]*idig[i];
		return rlt;
	}
	const poly<T> ln(int n)const {
		assert(a[0]==T(1));
		poly<T> rlt;
		rlt = (this->de()*this->inv(n)%n).inter()%n;
		return rlt;
	}
	const poly<T> ln(int n,poly<T> invf)const
	{return (this->de()*invf.inv_iter(*this)%n).inter()%n;}
	const poly<T> exp_iter(const poly<T> &f,const poly<T> &invg)const
	{return ((*this)*((f%(len*2))-(*this).ln(len*2,invg)+poly(vT{1})))%(len*2);}
	const poly<T> exp(int n)const {
		assert(a[0]==T(0));
		poly<T> g(vT{1});
		poly<T> invg(vT{1});
		int N = 1;
		while(N<n){
			g = g.exp_iter(*(this),invg);
			invg = invg.inv_iter(g);
			N <<= 1;
		}
		g %= n;
		return g;
	}
	pair<poly<T>,poly<T> > exp_with_inv(int n){
	// e^f(x) e^-f(x)
		assert(a[0]==T(0));
		poly<T> g(vT{1});
		poly<T> invg(vT{1});
		int N = 1;
		while(N<n){
			g = g.exp_iter(*(this),invg);
			invg = invg.inv_iter(g);
			N <<= 1;
		}
		g %= n;invg %= n;
		return m_p(g,invg);
	}
	poly<T> sqrt_iter(const poly<T> &f,const poly<T> &invg)const
	{return ((*this)+(f%(len*2)*invg.inv_iter(*this))%(len*2))*(T(2).inv());}
	poly<T> sqrt(int n)const {
		assert(a[0]==T(1));
		poly<T> g(vT{1});
		poly<T> invg(vT{1});
		int N = 1;
		while(N<n){
			g = g.sqrt_iter(*this,invg);
			invg = invg.inv_iter(g);
			N <<= 1;
		}
		g %= n;
		return g;
	}
	const poly<T> ksm(int n,ll d)const {
		assert(a[0]==T(1));
		poly<T> f = this->ln(n);
		rep(i,0,n)f[i] *= d;
		poly<T> rlt = f.exp(n);
		return rlt;
	}
};
template<class T>
ostream & operator << (ostream & cout,poly<T> f){
	cout<<"(";
	rep(i,0,f.len)cout<<f[i]<<",)"[i==f.len-1];
	return cout;
}
}
using Poly::poly;

标签:pp,const,int,len,return,poly,orange,rlt
From: https://www.cnblogs.com/pp-orange/p/18057867

相关文章

  • doxygen/addon/doxywizard/wizard.cpp
    Step2::Step2(Wizard*wizard,constQHash<QString,Input*>&modelData) :m_wizard(wizard),m_modelData(modelData){ QRadioButton*r; QVBoxLayout*layout=newQVBoxLayout(this); //--------------------------------------------------- m_extractMo......
  • 【教程】uni-app iOS打包解决profile文件与私钥证书不匹配问题
    摘要当在uni-app中进行iOS打包时,有时会遇到profile文件与私钥证书不匹配的问题。本文将介绍如何解决这一问题,以及相关的技术细节和操作步骤。引言在uni-app开发过程中,iOS打包是一个常见的操作。然而,有时会出现profile文件与私钥证书不匹配的错误提示,导致打包失败。为了解决这一......
  • 5G NR 加密完保 3GPP 协议
     1.3GPP文档33401-h40_Securityarchitecture.doc33501-hc0_Securityarchitectureandproceduresfor5Gsystem.doc35215-h00_Specificationofthe3GPPconfidentialityandintegrityAlgorithmsUEA2&UIA2Document1UEA2andUIA2specifications.doc35216-h0......
  • Salesforce入门级认证!App Builder备考指南
    AppBuilder认证适用于具有在Lightning平台上开发自定义应用程序的经验的个人,备考者通常需要有6个月到1年在Lightning平台或类似技术平台上构建应用程序的经验。AppBuilder认证对备考者的要求AppBuilder认证验证了备考者在数据建模与管理、流程自动化、用户界面、应用开发......
  • 钉钉如何通过AppLink快速连接仓储系统
    一、什么是APPlink?APPlink是RestCloud打造的一款简单易用的零代码自动化集成平台,为业务流程提供自动化的解决方案,将企业内部的核心系统以及第三方应用程序和云服务等进行集成。无论是开发人员还是业务人员,都可以使用APPlink轻松构建出高效、自动化的工作流,并将您的工作效率提升到......
  • VSCode 发布时报error MSB4018: “CreateAppHost”任务意外失败
    大概率是杀毒软件问题,我的问题是有360杀毒导致的网上的方案有如下,也都进行了尝试:重启VisualStudio以管理员身份运行VisualStudio清理解决方案删除bin目录下的所有文件均无效,无奈之下继续寻找解决方案,发现用ProcessMonitor来监控到底是谁在搞鬼。通过下载ProcessMo......
  • 【教程】无法验证app需要互联网连接以验证是否信任开发者
    摘要本文将探讨在使用苹果App时遇到无法验证开发者的情况,以及用户可以采取的解决方案。通过检查网络连接、重新操作、验证描述文件等方式来解决无法验证开发者的问题。同时,还介绍了开发者信任设置的步骤,以及使用appuploader工具进行安装测试的方法。引言在使用苹果App时,有时会......
  • Java 8 Supplier函数式接口介绍及代码样例
    介绍供应商接口(SupplierInterface)是Java8引入的java.util.function包的一部分,用于在Java中实现函数式编程。它表示一个函数,该函数不接收任何参数,但会产生一个类型为T的值。T:表示结果的类型分配给Supplier类型对象的lambda表达式用于定义其get(),最终产生一个值。......
  • 网页浏览器Chrome开发者调试工具-Application(应用程序)
    前言全局说明网页浏览器Chrome开发者调试工具-Application(应用程序)一、网页浏览器Chrome开发者调试工具-Application(应用程序)Application:应用面板,用于记录网站加载的所有资源信息,如存储、缓存、字体、图片等,同时也可以对一些资源进行修改和删除。二、关闭标签页......
  • snappy压缩格式下使用数字与字符串不等于比较,hiveSQL和sparkSQL表现不一致的行为记录
    Hive版本:2.3.4Spark版本:2.4.0当时用Snappy格式对表进行压缩时,时用<>符号将字符串与数字进行比较会产生不一致的结果。SparkSQL结果并非预期结果。DROPTABLEIFEXISTStest.zero_test;CREATETABLEtest.zero_testTBLPROPERTIES("orc.compress"="SNAPPY")ASSELECT......