首页 > 其他分享 >金拱门全家桶

金拱门全家桶

时间:2023-09-19 20:25:18浏览次数:26  
标签:return int 全家 Poly inline 拱门 mod size

#define int long long
#define N 2000005
using namespace std;
namespace Polynomial{
	const int mod=998244353,g=3,ig=332748118,B=25000;
	inline void add(int&x,int y){(x+=y)>=mod?x-=mod:x;}
	int pwg[B+1],PWG[B+1],pwig[B+1],PWIG[B+1],inv[N],lg[N],pw[N];
	inline void Init(){
		for(int i=pwg[0]=1;i<=B;i++)pwg[i]=pwg[i-1]*g%mod;
		for(int i=PWG[0]=1;i<=B;i++)PWG[i]=PWG[i-1]*pwg[B]%mod;
		for(int i=pwig[0]=1;i<=B;i++)pwig[i]=pwig[i-1]*ig%mod;
		for(int i=PWIG[0]=1;i<=B;i++)PWIG[i]=PWIG[i-1]*pwig[B]%mod;
		for(int i=pw[0]=inv[1]=1;i<N;i++)pw[i]=pw[i-1]*2%mod;
		for(int i=2;i<N;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod,lg[i]=lg[i>>1]+1;
	}
	inline int qpow(int k){
		if(k==0)return 1;
		if(k>0)return PWG[k/B]*pwg[k%B]%mod;
		if(k<0)return PWIG[(-k)/B]*pwig[(-k)%B]%mod;
		return 114514;
	}
	inline int qpow(int b,int k){
		int s=1;
		while(k){
			if(k&1)s=s*b%mod;
			b=b*b%mod;k>>=1;
		}
		return s;
	}
	namespace NTT{
		inline void Complete(vector<int>&f,int len){
			while((int)f.size()<len)f.emplace_back(0);
		}
		inline void NTT(vector<int>&f,int t){
			if(f.size()==1)return;
			int n=f.size(),buf=1,G=qpow(t*(mod-1)/n);
			vector<int>l,r;l.resize(n>>1,0);r.resize(n>>1,0);
			for(int i=0;i<n>>1;i++)l[i]=f[i<<1],r[i]=f[i<<1|1];
			NTT(l,t);NTT(r,t);
			for(int i=0;i<n>>1;i++,buf=buf*G%mod){
				f[i]=(l[i]+buf*r[i]%mod)%mod;
				f[i+(n>>1)]=(l[i]+mod-buf*r[i]%mod)%mod;
			}
		}// NTT
		inline void Init(vector<int>&x,int len){
			int p=pw[lg[len]];
			while(p<len)p<<=1;
			Complete(x,p);
		}// Complete to 2^x
		inline vector<int>Convol(vector<int>a,vector<int>b){
			int len=a.size()+b.size(),p=pw[lg[len]];
			while(p<len)p<<=1;
			Complete(a,p);NTT(a,1);
			Complete(b,p);NTT(b,1);
			for(int i=0;i<p;i++)a[i]=a[i]*b[i]%mod;
			NTT(a,-1);
			for(int i=0;i<p;i++)a[i]=a[i]*inv[p]%mod;
			while(a.back()==0)a.pop_back();
			return a;
		}// Convolution
		inline vector<int>Inverse(vector<int>f){
			if(f.size()==1)return vector<int>(1,qpow(f[0],mod-2));
			int n=f.size(),p=pw[lg[n]];
			vector<int>hlf(n>>1,0);
			for(int i=0;i<n>>1;i++)hlf[i]=f[i];
			vector<int>g=Inverse(hlf);
			while(p<n<<1)p<<=1;
			Complete(f,p);NTT(f,1);
			Complete(g,p);NTT(g,1);
			for(int i=0;i<p;i++)g[i]=(2+mod-f[i]*g[i]%mod)%mod*g[i]%mod;
			NTT(g,-1);
			for(int i=n;i<p;i++)g[i]=0;
			for(int i=0;i<p;i++)g[i]=g[i]*inv[p]%mod;
			return g;
		}// Inverse
		inline vector<int>Exponential(vector<int>f){
			
		}
	}
	using namespace NTT;
	struct Poly{
		vector<int>f;
		Poly(int x=0){f=vector<int>(x);}
		Poly(vector<int>x=vector<int>(0)){f=x;}
		inline int size(){return f.size();}
		inline int&operator[](int x){return f[x];}
		inline Poly operator+(Poly b){
			Poly a=*this,ret(max(a.size(),b.size()));
			for(int i=0;i<(int)a.size();i++)add(ret[i],a.f[i]);
			for(int i=0;i<(int)b.size();i++)add(ret[i],b.f[i]);
			return ret;
		}
		inline Poly operator-(Poly b){
			Poly a=*this,ret(max(a.size(),b.size()));
			for(int i=0;i<(int)a.size();i++)add(ret[i],a.f[i]);
			for(int i=0;i<(int)b.size();i++)add(ret[i],mod-b.f[i]);
			while(ret.f.back()==0)ret.f.pop_back();
			return ret;
		}
		inline Poly operator*(Poly b){return(Poly)(Convol(f,b.f));}
		inline Poly operator*(int x){
			Poly ret=*this;
			for(int i=0;i<(int)ret.size();i++)ret[i]=ret[i]*x%mod;
			return ret;
		}
		inline Poly Derivative(){
			if(size()==0)return*this;
			Poly ret(size()-1);
			for(int i=0;i<(int)ret.size();i++)ret[i]=f[i+1]*(i+1)%mod;
			return ret;
		}// F'
		inline Poly Integral(){
			Poly ret(size()+1);
			for(int i=1;i<(int)ret.size();i++)ret[i]=f[i-1]*inv[i]%mod;
			return ret;
		}// ∫ F(x)dx
		inline Poly Ln(){
			Poly x=*this;Init(x.f,x.size());
			Poly deri=x.Derivative(),inve=Inverse(x.f),inte=deri*inve;
			return inte.Integral();
		}// ln(F)
		inline Poly Exp(){return Exponential(f);}// exp(F)
		inline Poly operator^(int k){return((*this).Ln()*k).Exp();}
		inline Poly operator^(Poly k){return((*this).Ln()*k).Exp();}// quick power
	};
}
using namespace Polynomial;

标签:return,int,全家,Poly,inline,拱门,mod,size
From: https://www.cnblogs.com/pidan123/p/17715696.html

相关文章

  • 深入探讨Spring全家桶的AOP实现原理
    前言Spring全家桶是Java开发中最常用的框架之一,其中AOP是Spring框架的核心之一。本文将深入探讨Spring全家桶的AOP实现原理。AOP简介AOP(AspectOrientedProgramming)是一种编程范式,它通过在程序运行时动态地将代码切入到类的指定方法、指定位置上,实现对原有代码的增强。AOP的主......
  • 超全面详细一条龙教程!从零搭建React项目全家桶(上篇)
    超全面详细一条龙教程!从零搭建React项目全家桶(上篇)兔子先生 ​关注他 101人赞同了该文章 React是近几年来前端项目开发非常火的一个框架,其背景是Facebook团队的技术支持,市场占有率也很高。很多初学者纠结一开始是学react还是vue。个人觉得,有时间的......
  • 多项式全家桶(未全)
    一些约定:下面\(f^i(x)\)表示\(i\)阶导数。\(f(x)^i\)表示幂次。若不说明绝大部分除一个多项式时都是代表乘上它的逆。多项式加减,求导积分过于简单不讲。\((x^a)'=ax^{a-1},\displaystyle\intx^a{\rmd}x=\dfrac{x^{a+1}}{a+1}+C\)。实际操作时\(C=0\),正确性是好证的。(如......
  • 2023版idea激活-畅快体验革命性新UI体验(JetBrain全家桶适用)
    2023版idea激活-畅快体验革命性新UI体验(JetBrain全家桶适用)IntelliJIDEA最近发布了2023.1版本,该版本在UI设计上进行了革命性的改进,为广大Java开发者带来前所未有的顺滑编码体验。......
  • 多项式小全家桶
    比较安全的模板,传入的数组\(g\)有初值也没有问题,且求解过程中不会对传入的\(f\)修改#include<bits/stdc++.h>usingnamespacestd;constintN=1<<17;constintmod=998244353;boolmem1;charbuf[1<<23],*p1=buf,*p2=buf;#definegetchar()(p1==p2......
  • lr下载-中文官版下载网址adobe全家桶软件下载 中文版直装
    Lr6.0中文版是一款出自Adobe公司之手的实用型照片编辑管理工具,Lr6.0中文版功能强劲,为数码摄影、图形设计等专业用户提供了强大数码相片浏览、编辑、整理、打印等功能,AdobeLightroom6.0中文版能够帮助用户轻松的管理大型照片图库。软件地址:看置顶贴版本功能Lr6.0中文版附带全新......
  • 佛山平洲玉器街玉廉广场装饰紫铜锻打浮雕拱门雕塑厂家报价
    佛山平洲玉器街玉廉广场装饰紫铜锻打浮雕拱门雕塑厂家报价紫铜锻打浮雕拱门雕塑是采用紫铜材质制作而成,多用于建筑彩画和高贵豪华的器皿装饰上。紫铜浮雕以不腐不脱色的优质紫铜为原材料,经过多道工序精制而成。紫铜浮雕是中国古代文化艺术的其中一种,造型多种多样,画面栩栩如生。紫铜......
  • Vue全家桶系~2.Vue3开篇(过渡)
    Vue全家桶先贴一下Vue3的官方文档:https://cn.vuejs.org/guide/introduction.html官方API文档:https://cn.vuejs.org/api/1.前言:新旧时代交替1.1.开发变化1.网络模型的变化:以前网页大多是b/s,服务端代码混合在页面里;现在是c/s,前后端分离,通过jsapi(类似ajax的方式)获取j......
  • 数论全家桶
    数论全家桶目录数论全家桶欧拉定理中国剩余定理CRTEXCRTLUCAS定理卡特兰数欧拉定理1.结论$$∀a,m∈Z且gcd(a,m)=1,a^{\varphi(m)}\equiv1\(mod\m)$$欧拉定理的一个常见用法是对指数降幂。应用当mod数质数时,有$$a^b\equiva^{bmod\phi(m)} (modm), gcd(a,m)=1;$$例......
  • burry的全家桶
    点击查看代码%:pragmaGCCoptimize(3)%:pragmaGCCoptimize("Ofast")%:pragmaGCCoptimize("inline")%:pragmaGCCoptimize("-fgcse")%:pragmaGCCoptimize("-fgcse-lm")%:pragmaGCCoptimize("-fipa-sra")%:pragma......